00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <string.h>
00025 #include <stdio.h>
00026 #include <stdlib.h>
00027 #include "types.h"
00028 #include "globals.h"
00029 #include "errors.h"
00030 #include "netlist_utils.h"
00031 #include "odin_util.h"
00032 #include "ast_util.h"
00033 #include "netlist_create_from_ast.h"
00034 #include "string_cache.h"
00035 #include "netlist_visualizer.h"
00036 #include "parse_making_ast.h"
00037 #include "node_creation_library.h"
00038 #include "util.h"
00039 #include "multipliers.h"
00040 #include "hard_blocks.h"
00041 #include "memories.h"
00042
00043
00044
00045
00046
00047
00048
00049 #define INSTANTIATE_DRIVERS 1
00050 #define ALIAS_INPUTS 2
00051
00052 #define COMBINATIONAL 1
00053 #define SEQUENTIAL 2
00054
00055 STRING_CACHE *output_nets_sc;
00056 STRING_CACHE *input_nets_sc;
00057
00058 STRING_CACHE *local_symbol_table_sc;
00059 ast_node_t** local_symbol_table;
00060 int num_local_symbol_table;
00061 signal_list_t *local_clock_list;
00062 short local_clock_found;
00063 int local_clock_idx;
00064
00065
00066 char *one_string = "ONE_VCC_CNS";
00067 char *zero_string = "ZERO_GND_ZERO";
00068 char *pad_string = "ZERO_PAD_ZERO";
00069
00070 ast_node_t *top_module;
00071
00072 netlist_t *verilog_netlist;
00073
00074 int netlist_create_line_number = -2;
00075
00076 int type_of_circuit;
00077
00078
00079
00080 void convert_ast_to_netlist_recursing_via_modules(ast_node_t* current_module, char *instance_name, int level);
00081 signal_list_t *netlist_expand_ast_of_module(ast_node_t* node, char *instance_name_prefix);
00082
00083 void create_all_driver_nets_in_this_module(char *instance_name_prefix);
00084
00085 ast_node_t *find_top_module();
00086
00087 void create_top_driver_nets(ast_node_t* module, char *instance_name_prefix);
00088 void create_top_output_nodes(ast_node_t* module, char *instance_name_prefix);
00089 nnet_t* define_nets_with_driver(ast_node_t* var_declare, char *instance_name_prefix);
00090 nnet_t* define_nodes_and_nets_with_driver(ast_node_t* var_declare, char *instance_name_prefix);
00091
00092 void connect_hard_block_and_alias(ast_node_t* module_instance, char *instance_name_prefix);
00093 void connect_module_instantiation_and_alias(short PASS, ast_node_t* module_instance, char *instance_name_prefix);
00094 void create_symbol_table_for_module(ast_node_t* module_items);
00095
00096 signal_list_t *create_gate(ast_node_t* gate, char *instance_name_prefix);
00097 signal_list_t *create_hard_block(ast_node_t* block, char *instance_name_prefix);
00098 signal_list_t *create_pins(ast_node_t* var_declare, char *name, char *instance_name_prefix);
00099 signal_list_t *create_output_pin(ast_node_t* var_declare, char *instance_name_prefix);
00100 signal_list_t *assignment_alias(ast_node_t* assignment, char *instance_name_prefix);
00101 signal_list_t *create_operation_node(ast_node_t *op, signal_list_t **input_lists, int list_size, char *instance_name_prefix);
00102
00103 void terminate_continuous_assignment(ast_node_t *node, signal_list_t* assignment, char *instance_name_prefix);
00104 void terminate_registered_assignment(ast_node_t *always_node, signal_list_t* assignment, signal_list_t *potential_clocks, char *instance_name_prefix);
00105
00106 signal_list_t *create_case(ast_node_t *case_ast, char *instance_name_prefix);
00107 void create_case_control_signals(ast_node_t *case_list_of_items, ast_node_t *compare_against, nnode_t *case_node, char *instance_name_prefix);
00108 signal_list_t *create_case_mux_statements(ast_node_t *case_list_of_items, nnode_t *case_node, char *instance_name_prefix);
00109 signal_list_t *create_if(ast_node_t *if_ast, char *instance_name_prefix);
00110 void create_if_control_signals(ast_node_t *if_expression, nnode_t *if_node, char *instance_name_prefix);
00111 signal_list_t *create_if_mux_statements(ast_node_t *if_ast, nnode_t *if_node, char *instance_name_prefix);
00112 signal_list_t *create_if_for_question(ast_node_t *if_ast, char *instance_name_prefix);
00113 signal_list_t *create_if_question_mux_expressions(ast_node_t *if_ast, nnode_t *if_node, char *instance_name_prefix);
00114 signal_list_t *create_mux_statements(signal_list_t **statement_lists, nnode_t *case_node, int num_statement_lists, char *instance_name_prefix);
00115 signal_list_t *create_mux_expressions(signal_list_t **expression_lists, nnode_t *mux_node, int num_expression_lists, char *instance_name_prefix);
00116
00117 signal_list_t *evaluate_sensitivity_list(ast_node_t *delay_control, char *instance_name_prefix);
00118
00119 int alias_output_assign_pins_to_inputs(char_list_t *output_list, signal_list_t *input_list, ast_node_t *node);
00120
00121 int find_smallest_non_numerical(ast_node_t *node, signal_list_t **input_list, int num_input_lists);
00122 void pad_with_zeros(ast_node_t* node, signal_list_t *list, int pad_size, char *instance_name_prefix);
00123
00124 void look_for_clocks(netlist_t *netlist);
00125
00126
00127
00128
00129 void create_netlist()
00130 {
00131
00132
00133
00134 top_module = find_top_module();
00135 if (!global_args.output_file)
00136 {
00137 global_args.output_file = malloc(strlen(top_module->children[0]->types.identifier) + 5 + 1);
00138 sprintf(global_args.output_file, "%s.blif", top_module->children[0]->types.identifier);
00139 }
00140
00141
00142
00143
00144
00145 output_nets_sc = sc_new_string_cache();
00146 input_nets_sc = sc_new_string_cache();
00147
00148 verilog_netlist = allocate_netlist();
00149
00150
00151 create_top_driver_nets(top_module, "top");
00152 convert_ast_to_netlist_recursing_via_modules(top_module, "top", 0);
00153 create_top_output_nodes(top_module, "top");
00154
00155
00156 look_for_clocks(verilog_netlist);
00157 }
00158
00159
00160
00161
00162 void look_for_clocks(netlist_t *netlist)
00163 {
00164 int i;
00165
00166 for (i = 0; i < netlist->num_ff_nodes; i++)
00167 {
00168 if (netlist->ff_nodes[i]->input_pins[1]->net->driver_pin->node->type != CLOCK_NODE)
00169 {
00170 netlist->ff_nodes[i]->input_pins[1]->net->driver_pin->node->type = CLOCK_NODE;
00171 }
00172 }
00173 }
00174
00175
00176
00177
00178
00179
00180 ast_node_t *find_top_module()
00181 {
00182 int i, j;
00183 long sc_spot;
00184 int found_top = -1;
00185
00186
00187 for (i = 0; i < num_modules; i++)
00188 {
00189 for (j = 0; j < ast_modules[i]->types.module.size_module_instantiations; j++)
00190 {
00191
00192
00193 #ifdef VPR6
00194 if ((sc_spot = sc_lookup_string(hard_block_names, ast_modules[i]->types.module.module_instantiations_instance[j]->children[0]->types.identifier)) == -1)
00195 #endif
00196 {
00197
00198 if ((sc_spot = sc_lookup_string(module_names_to_idx, ast_modules[i]->types.module.module_instantiations_instance[j]->children[0]->types.identifier)) == -1)
00199 {
00200 error_message(NETLIST_ERROR, ast_modules[i]->line_number, ast_modules[i]->file_number, "Can't find module name (%s)\n", ast_modules[i]->types.module.module_instantiations_instance[j]->types.identifier);
00201 }
00202
00203
00204 ast_modules[((ast_node_t*)module_names_to_idx->data[sc_spot])->types.module.index]->types.module.is_instantiated = TRUE;
00205 }
00206 }
00207 }
00208
00209
00210 for (i = 0; i < num_modules; i++)
00211 {
00212 if ((ast_modules[i]->types.module.is_instantiated == FALSE) && (found_top == -1))
00213 {
00214 found_top = i;
00215 }
00216 else if ((ast_modules[i]->types.module.is_instantiated == FALSE) && (found_top != -1))
00217 {
00218 error_message(NETLIST_ERROR, ast_modules[i]->line_number, ast_modules[i]->file_number, "Two top level modules - Odin II cannot deal with these types of designs\n");
00219 }
00220 }
00221
00222
00223 if (found_top == -1)
00224 {
00225 error_message(NETLIST_ERROR, -1, -1, "Could not find a top level module\n");
00226 }
00227
00228 return ast_modules[found_top];
00229 }
00230
00231
00232
00233
00234
00235
00236 void convert_ast_to_netlist_recursing_via_modules(ast_node_t* current_module, char *instance_name, int level)
00237 {
00238 int i;
00239 long sc_spot;
00240 signal_list_t *list = NULL;
00241
00242
00243 if (current_module->types.module.size_module_instantiations == 0)
00244 {
00245 list = netlist_expand_ast_of_module(current_module, instance_name);
00246 }
00247 else
00248 {
00249
00250 for (i = 0; i < current_module->types.module.size_module_instantiations; i++)
00251 {
00252 char *temp_instance_name;
00253
00254 temp_instance_name = make_full_ref_name(instance_name, current_module->types.module.module_instantiations_instance[i]->children[0]->types.identifier, current_module->types.module.module_instantiations_instance[i]->children[1]->children[0]->types.identifier, NULL, -1);
00255
00256
00257 if ((sc_spot = sc_lookup_string(module_names_to_idx, current_module->types.module.module_instantiations_instance[i]->children[0]->types.identifier)) == -1)
00258 {
00259 error_message(NETLIST_ERROR, current_module->line_number, current_module->file_number, "Can't find module name %s\n", current_module->types.module.module_instantiations_instance[i]->children[0]->types.identifier);
00260 }
00261
00262
00263 convert_ast_to_netlist_recursing_via_modules(((ast_node_t*)module_names_to_idx->data[sc_spot]), temp_instance_name, level+1);
00264
00265
00266 free(temp_instance_name);
00267 }
00268
00269
00270 netlist_expand_ast_of_module(current_module, instance_name);
00271 }
00272
00273 if (list != NULL)
00274 clean_signal_list_structure(list);
00275 }
00276
00277
00278
00279
00280
00281
00282
00283 signal_list_t *netlist_expand_ast_of_module(ast_node_t* node, char *instance_name_prefix)
00284 {
00285
00286 int i;
00287 short *child_skip_list = NULL;
00288 short skip_children = FALSE;
00289 signal_list_t *return_sig_list = NULL;
00290 signal_list_t **children_signal_list = NULL;
00291
00292 if (node == NULL)
00293 {
00294
00295 }
00296 else
00297 {
00298
00299 if (node->num_children > 0)
00300 {
00301 child_skip_list = (short*)calloc(node->num_children, sizeof(short));
00302 children_signal_list = (signal_list_t**)malloc(sizeof(signal_list_t*)*node->num_children);
00303 }
00304
00305
00306
00307 switch(node->type)
00308 {
00309 case FILE_ITEMS:
00310 oassert(FALSE);
00311 break;
00312 case MODULE:
00313
00314 child_skip_list[0] = TRUE;
00315 child_skip_list[1] = TRUE;
00316 break;
00317 case MODULE_ITEMS:
00318
00319
00320
00321 local_symbol_table_sc = sc_new_string_cache();
00322 local_symbol_table = NULL;
00323 num_local_symbol_table = 0;
00324 create_symbol_table_for_module(node);
00325 local_clock_found = FALSE;
00326
00327
00328 create_all_driver_nets_in_this_module(instance_name_prefix);
00329
00330
00331 if (node->num_children > 0)
00332 {
00333 for (i = 0; i < node->num_children; i++)
00334 {
00335 if (node->children[i]->type == VAR_DECLARE_LIST)
00336 {
00337
00338 child_skip_list[i] = TRUE;
00339 }
00340 else if (node->children[i]->type == MODULE_INSTANCE)
00341 {
00342
00343
00344
00345
00346 connect_module_instantiation_and_alias(INSTANTIATE_DRIVERS, node->children[i], instance_name_prefix);
00347
00348
00349 child_skip_list[i] = TRUE;
00350 }
00351 }
00352 }
00353 break;
00354 case GATE:
00355
00356 return_sig_list = create_gate(node, instance_name_prefix);
00357
00358 skip_children = TRUE;
00359 break;
00360
00361
00362 case ARRAY_REF:
00363 case CONCATENATE:
00364 case IDENTIFIERS:
00365 case RANGE_REF:
00366 case NUMBERS:
00367 {
00368 return_sig_list = create_pins(node, NULL, instance_name_prefix);
00369
00370 skip_children = TRUE;
00371 break;
00372 }
00373
00374 case ASSIGN:
00375
00376 type_of_circuit = COMBINATIONAL;
00377 break;
00378 case BLOCKING_STATEMENT:
00379 if (type_of_circuit == SEQUENTIAL)
00380 {
00381 error_message(NETLIST_ERROR, node->line_number, node->file_number, "ODIN doesn't handle blocking statements in Sequential blocks\n");
00382 }
00383 else
00384 {
00385 return_sig_list = assignment_alias(node, instance_name_prefix);
00386 skip_children = TRUE;
00387 }
00388 break;
00389 case NON_BLOCKING_STATEMENT:
00390 if (type_of_circuit != SEQUENTIAL)
00391 {
00392 error_message(NETLIST_ERROR, node->line_number, node->file_number, "ODIN doesn't handle non blocking statements in combinational blocks\n");
00393 }
00394 return_sig_list = assignment_alias(node, instance_name_prefix);
00395 skip_children = TRUE;
00396 break;
00397 case ALWAYS:
00398
00399 local_clock_list = evaluate_sensitivity_list(node->children[0], instance_name_prefix);
00400 child_skip_list[0] = TRUE;
00401 break;
00402 case CASE:
00403 return_sig_list = create_case(node, instance_name_prefix);
00404 skip_children = TRUE;
00405 break;
00406 case IF:
00407 return_sig_list = create_if(node, instance_name_prefix);
00408 skip_children = TRUE;
00409 break;
00410 case IF_Q:
00411 return_sig_list = create_if_for_question(node, instance_name_prefix);
00412 skip_children = TRUE;
00413 break;
00414 #ifdef VPR6
00415 case HARD_BLOCK:
00416
00417 child_skip_list[0] = TRUE;
00418 child_skip_list[1] = TRUE;
00419 return_sig_list = create_hard_block(node, instance_name_prefix);
00420 break;
00421 #endif
00422 default:
00423 break;
00424 }
00425
00426
00427 if (skip_children == FALSE)
00428 {
00429
00430 for (i = 0; i < node->num_children; i++)
00431 {
00432 if (child_skip_list[i] == FALSE)
00433 {
00434
00435 children_signal_list[i] = netlist_expand_ast_of_module(node->children[i], instance_name_prefix);
00436 }
00437 }
00438 }
00439
00440
00441
00442 switch(node->type)
00443 {
00444 case FILE_ITEMS:
00445 oassert(FALSE);
00446 break;
00447 case MODULE_ITEMS:
00448 {
00449 if (node->num_children > 0)
00450 {
00451 for (i = 0; i < node->num_children; i++)
00452 {
00453 if (node->children[i]->type == MODULE_INSTANCE)
00454 {
00455
00456
00457 connect_module_instantiation_and_alias(ALIAS_INPUTS, node->children[i], instance_name_prefix);
00458 }
00459 }
00460 }
00461
00462
00463 sc_free_string_cache(local_symbol_table_sc);
00464 free(local_symbol_table);
00465
00466 break;
00467 }
00468 case ASSIGN:
00469 oassert(node->num_children == 1);
00470
00471 terminate_continuous_assignment(node, children_signal_list[0], instance_name_prefix);
00472 break;
00473 case ALWAYS:
00474
00475 if (type_of_circuit == COMBINATIONAL)
00476 {
00477
00478 terminate_continuous_assignment(node, children_signal_list[1], instance_name_prefix);
00479 }
00480 else if (type_of_circuit == SEQUENTIAL)
00481 {
00482 terminate_registered_assignment(node, children_signal_list[1], local_clock_list, instance_name_prefix);
00483 }
00484 else
00485 oassert(FALSE);
00486 break;
00487 case BINARY_OPERATION:
00488 oassert(node->num_children == 2);
00489 return_sig_list = create_operation_node(node, children_signal_list, node->num_children, instance_name_prefix);
00490 break;
00491 case UNARY_OPERATION:
00492 oassert(node->num_children == 1);
00493 return_sig_list = create_operation_node(node, children_signal_list, node->num_children, instance_name_prefix);
00494 break;
00495 case BLOCK:
00496 return_sig_list = combine_lists(children_signal_list, node->num_children);
00497 break;
00498 #ifdef VPR6
00499 case MEMORY:
00500 connect_memory_and_alias(node, instance_name_prefix);
00501 break;
00502 case HARD_BLOCK:
00503 connect_hard_block_and_alias(node, instance_name_prefix);
00504 break;
00505 #endif
00506 case IF:
00507 default:
00508 break;
00509 }
00510
00511 }
00512
00513
00514 if (child_skip_list != NULL)
00515 {
00516 free(child_skip_list);
00517 }
00518 if (children_signal_list != NULL)
00519 {
00520 free(children_signal_list);
00521 }
00522
00523 return return_sig_list;
00524 }
00525
00526
00527
00528
00529
00530
00531
00532 void create_all_driver_nets_in_this_module(char *instance_name_prefix)
00533 {
00534
00535 int i;
00536
00537
00538 for (i = 0; i < num_local_symbol_table; i++)
00539 {
00540 oassert(local_symbol_table[i]->type == VAR_DECLARE);
00541 if ( (local_symbol_table[i]->types.variable.is_reg)
00542 ||
00543 ((local_symbol_table[i]->types.variable.is_wire) && (local_symbol_table[i]->types.variable.is_input == FALSE))
00544 ||
00545 ((local_symbol_table[i]->types.variable.is_output) && (local_symbol_table[i]->types.variable.is_reg == FALSE) && (local_symbol_table[i]->types.variable.is_wire == FALSE))
00546 )
00547 {
00548
00549 define_nets_with_driver(local_symbol_table[i], instance_name_prefix);
00550 }
00551
00552 }
00553 }
00554
00555
00556
00557
00558
00559
00560
00561
00562 void create_top_driver_nets(ast_node_t* module, char *instance_name_prefix)
00563 {
00564
00565 int i, j;
00566 long sc_spot;
00567 ast_node_t *module_items = module->children[2];
00568 npin_t *new_pin;
00569
00570 oassert(module_items->type == MODULE_ITEMS);
00571
00572
00573 if (module_items->num_children > 0)
00574 {
00575 for (i = 0; i < module_items->num_children; i++)
00576 {
00577 if (module_items->children[i]->type == VAR_DECLARE_LIST)
00578 {
00579
00580 for (j = 0; j < module_items->children[i]->num_children; j++)
00581 {
00582 if (module_items->children[i]->children[j]->types.variable.is_input)
00583 {
00584 define_nodes_and_nets_with_driver(module_items->children[i]->children[j], instance_name_prefix);
00585 }
00586 }
00587 }
00588 }
00589 }
00590 else
00591 {
00592 error_message(NETLIST_ERROR, module_items->line_number, module_items->file_number, "Module is empty\n");
00593 }
00594
00595
00596 verilog_netlist->zero_net = allocate_nnet();
00597 verilog_netlist->gnd_node = allocate_nnode();
00598 verilog_netlist->gnd_node->type = GND_NODE;
00599 allocate_more_node_output_pins(verilog_netlist->gnd_node, 1);
00600 add_output_port_information(verilog_netlist->gnd_node, 1);
00601 new_pin = allocate_npin();
00602 add_a_output_pin_to_node_spot_idx(verilog_netlist->gnd_node, new_pin, 0);
00603 add_a_driver_pin_to_net(verilog_netlist->zero_net, new_pin);
00604
00605 verilog_netlist->one_net = allocate_nnet();
00606 verilog_netlist->vcc_node = allocate_nnode();
00607 verilog_netlist->vcc_node->type = VCC_NODE;
00608 allocate_more_node_output_pins(verilog_netlist->vcc_node, 1);
00609 add_output_port_information(verilog_netlist->vcc_node, 1);
00610 new_pin = allocate_npin();
00611 add_a_output_pin_to_node_spot_idx(verilog_netlist->vcc_node, new_pin, 0);
00612 add_a_driver_pin_to_net(verilog_netlist->one_net, new_pin);
00613
00614 verilog_netlist->pad_net = allocate_nnet();
00615 verilog_netlist->pad_node = allocate_nnode();
00616 verilog_netlist->pad_node->type = PAD_NODE;
00617 allocate_more_node_output_pins(verilog_netlist->pad_node, 1);
00618 add_output_port_information(verilog_netlist->pad_node, 1);
00619 new_pin = allocate_npin();
00620 add_a_output_pin_to_node_spot_idx(verilog_netlist->pad_node, new_pin, 0);
00621 add_a_driver_pin_to_net(verilog_netlist->pad_net, new_pin);
00622
00623
00624 zero_string = make_full_ref_name(instance_name_prefix, NULL, NULL, zero_string, -1);
00625 verilog_netlist->gnd_node->name = zero_string;
00626
00627 sc_spot = sc_add_string(output_nets_sc, zero_string);
00628 if (output_nets_sc->data[sc_spot] != NULL)
00629 {
00630 error_message(NETLIST_ERROR, module_items->line_number, module_items->file_number, "Error in Odin\n");
00631 }
00632
00633 output_nets_sc->data[sc_spot] = (void*)verilog_netlist->zero_net;
00634 verilog_netlist->zero_net->name = zero_string;
00635
00636
00637 one_string = make_full_ref_name(instance_name_prefix, NULL, NULL, one_string, -1);
00638 verilog_netlist->vcc_node->name = one_string;
00639
00640 sc_spot = sc_add_string(output_nets_sc, one_string);
00641 if (output_nets_sc->data[sc_spot] != NULL)
00642 {
00643 error_message(NETLIST_ERROR, module_items->line_number, module_items->file_number, "Error in Odin\n");
00644 }
00645
00646 output_nets_sc->data[sc_spot] = (void*)verilog_netlist->one_net;
00647 verilog_netlist->one_net->name = one_string;
00648
00649
00650 pad_string = make_full_ref_name(instance_name_prefix, NULL, NULL, pad_string, -1);
00651 verilog_netlist->pad_node->name = pad_string;
00652
00653 sc_spot = sc_add_string(output_nets_sc, pad_string);
00654 if (output_nets_sc->data[sc_spot] != NULL)
00655 {
00656 error_message(NETLIST_ERROR, module_items->line_number, module_items->file_number, "Error in Odin\n");
00657 }
00658
00659 output_nets_sc->data[sc_spot] = (void*)verilog_netlist->pad_net;
00660 verilog_netlist->pad_net->name = pad_string;
00661 }
00662
00663
00664
00665
00666
00667
00668
00669 void create_top_output_nodes(ast_node_t* module, char *instance_name_prefix)
00670 {
00671
00672 int i, j, k;
00673 long sc_spot;
00674 ast_node_t *module_items = module->children[2];
00675 nnode_t *new_node;
00676
00677 oassert(module_items->type == MODULE_ITEMS);
00678
00679
00680 if (module_items->num_children > 0)
00681 {
00682 for (i = 0; i < module_items->num_children; i++)
00683 {
00684 if (module_items->children[i]->type == VAR_DECLARE_LIST)
00685 {
00686
00687 for (j = 0; j < module_items->children[i]->num_children; j++)
00688 {
00689 if (module_items->children[i]->children[j]->types.variable.is_output)
00690 {
00691 char *full_name;
00692 ast_node_t *var_declare = module_items->children[i]->children[j];
00693 npin_t *new_pin;
00694
00695
00696 if (var_declare->children[1] == NULL)
00697 {
00698
00699
00700 full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, var_declare->children[0]->types.identifier, -1);
00701
00702
00703 if ((sc_spot = sc_lookup_string(output_nets_sc, full_name)) == -1)
00704 {
00705 error_message(NETLIST_ERROR, var_declare->children[0]->line_number, var_declare->children[0]->file_number, "Output pin (%s) is not hooked up!!!\n", full_name);
00706 }
00707
00708 new_pin = allocate_npin();
00709
00710 add_a_fanout_pin_to_net((nnet_t*)output_nets_sc->data[sc_spot], new_pin);
00711
00712
00713 new_node = allocate_nnode();
00714 new_node->related_ast_node = module_items->children[i]->children[j];
00715 new_node->name = full_name;
00716 new_node->type = OUTPUT_NODE;
00717
00718 allocate_more_node_input_pins(new_node, 1);
00719 add_input_port_information(new_node, 1);
00720
00721
00722 add_a_input_pin_to_node_spot_idx(new_node, new_pin, 0);
00723
00724
00725 verilog_netlist->top_output_nodes = (nnode_t**)realloc(verilog_netlist->top_output_nodes, sizeof(nnode_t*)*(verilog_netlist->num_top_output_nodes+1));
00726 verilog_netlist->top_output_nodes[verilog_netlist->num_top_output_nodes] = new_node;
00727 verilog_netlist->num_top_output_nodes++;
00728 }
00729 else if (var_declare->children[3] == NULL)
00730 {
00731
00732 for (k = var_declare->children[2]->types.number.value; k <= var_declare->children[1]->types.number.value; k++)
00733 {
00734
00735 full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, var_declare->children[0]->types.identifier, k);
00736
00737
00738 if ((sc_spot = sc_lookup_string(output_nets_sc, full_name)) == -1)
00739 {
00740 error_message(NETLIST_ERROR, var_declare->children[0]->line_number, var_declare->children[0]->file_number, "Output pin (%s) is not hooked up!!!\n", full_name);
00741 }
00742 new_pin = allocate_npin();
00743
00744 add_a_fanout_pin_to_net((nnet_t*)output_nets_sc->data[sc_spot], new_pin);
00745
00746
00747 new_node = allocate_nnode();
00748 new_node->related_ast_node = module_items->children[i]->children[j];
00749 new_node->name = full_name;
00750 new_node->type = OUTPUT_NODE;
00751
00752 allocate_more_node_input_pins(new_node, 1);
00753 add_input_port_information(new_node, 1);
00754
00755
00756 add_a_input_pin_to_node_spot_idx(new_node, new_pin, 0);
00757
00758
00759 verilog_netlist->top_output_nodes = (nnode_t**)realloc(verilog_netlist->top_output_nodes, sizeof(nnode_t*)*(verilog_netlist->num_top_output_nodes+1));
00760 verilog_netlist->top_output_nodes[verilog_netlist->num_top_output_nodes] = new_node;
00761 verilog_netlist->num_top_output_nodes++;
00762 }
00763 }
00764 else
00765 {
00766
00767 error_message(NETLIST_ERROR, var_declare->children[0]->line_number, var_declare->children[0]->file_number, "Memory not handled ... yet!\n");
00768 }
00769 }
00770 }
00771 }
00772 }
00773 }
00774 else
00775 {
00776 error_message(NETLIST_ERROR, module_items->line_number, module_items->file_number, "Empty module\n");
00777 }
00778 }
00779
00780
00781
00782
00783
00784 nnet_t* define_nets_with_driver(ast_node_t* var_declare, char *instance_name_prefix)
00785 {
00786 int i;
00787 char *temp_string;
00788 long sc_spot;
00789 nnet_t *new_net = NULL;
00790
00791 if (var_declare->children[1] == NULL)
00792 {
00793
00794
00795
00796 new_net = allocate_nnet();
00797
00798
00799 temp_string = make_full_ref_name(instance_name_prefix, NULL, NULL, var_declare->children[0]->types.identifier, -1);
00800
00801
00802 sc_spot = sc_add_string(output_nets_sc, temp_string);
00803 if (output_nets_sc->data[sc_spot] != NULL)
00804 {
00805 error_message(NETLIST_ERROR, var_declare->children[0]->line_number, var_declare->children[0]->file_number, "Net (%s) with the same name already created\n", temp_string);
00806 }
00807
00808 output_nets_sc->data[sc_spot] = (void*)new_net;
00809 new_net->name = temp_string;
00810 }
00811 else if (var_declare->children[3] == NULL)
00812 {
00813
00814 oassert((var_declare->children[1]->type == NUMBERS) && (var_declare->children[2]->type == NUMBERS)) ;
00815
00816
00817
00818 for (i = var_declare->children[2]->types.number.value; i <= var_declare->children[1]->types.number.value; i++)
00819 {
00820
00821 new_net = allocate_nnet();
00822
00823
00824 temp_string = make_full_ref_name(instance_name_prefix, NULL, NULL, var_declare->children[0]->types.identifier, i);
00825
00826 sc_spot = sc_add_string(output_nets_sc, temp_string);
00827 if (output_nets_sc->data[sc_spot] != NULL)
00828 {
00829 error_message(NETLIST_ERROR, var_declare->children[0]->line_number, var_declare->children[0]->file_number, "Net (%s) with the same name already created\n", temp_string);
00830 }
00831
00832 output_nets_sc->data[sc_spot] = (void*)new_net;
00833 new_net->name = temp_string;
00834 }
00835 }
00836 else if (var_declare->children[3] != NULL)
00837 {
00838
00839 oassert(FALSE);
00840 }
00841
00842 return new_net;
00843 }
00844
00845
00846
00847
00848
00849
00850 nnet_t* define_nodes_and_nets_with_driver(ast_node_t* var_declare, char *instance_name_prefix)
00851 {
00852 int i;
00853 char *temp_string;
00854 long sc_spot;
00855 nnet_t *new_net = NULL;
00856 npin_t *new_pin;
00857 nnode_t *new_node;
00858
00859 if (var_declare->children[1] == NULL)
00860 {
00861
00862
00863
00864 new_net = allocate_nnet();
00865
00866 temp_string = make_full_ref_name(instance_name_prefix, NULL, NULL, var_declare->children[0]->types.identifier, -1);
00867
00868 sc_spot = sc_add_string(output_nets_sc, temp_string);
00869 if (output_nets_sc->data[sc_spot] != NULL)
00870 {
00871 error_message(NETLIST_ERROR, var_declare->children[0]->line_number, var_declare->children[0]->file_number, "Net (%s) with the same name already created\n", temp_string);
00872 }
00873
00874 output_nets_sc->data[sc_spot] = (void*)new_net;
00875 new_net->name = temp_string;
00876
00877
00878 new_pin = allocate_npin();
00879 new_node = allocate_nnode();
00880 new_node->name = temp_string;
00881
00882 new_node->related_ast_node = var_declare;
00883 new_node->type = INPUT_NODE;
00884
00885 allocate_more_node_output_pins(new_node, 1);
00886 add_output_port_information(new_node, 1);
00887
00888
00889 add_a_output_pin_to_node_spot_idx(new_node, new_pin, 0);
00890 add_a_driver_pin_to_net(new_net, new_pin);
00891
00892
00893 verilog_netlist->top_input_nodes = (nnode_t**)realloc(verilog_netlist->top_input_nodes, sizeof(nnode_t*)*(verilog_netlist->num_top_input_nodes+1));
00894 verilog_netlist->top_input_nodes[verilog_netlist->num_top_input_nodes] = new_node;
00895 verilog_netlist->num_top_input_nodes++;
00896 }
00897 else if (var_declare->children[3] == NULL)
00898 {
00899
00900 oassert((var_declare->children[1]->type == NUMBERS) && (var_declare->children[2]->type == NUMBERS)) ;
00901
00902
00903 for (i = var_declare->children[2]->types.number.value; i <= var_declare->children[1]->types.number.value; i++)
00904 {
00905
00906 new_net = allocate_nnet();
00907
00908
00909 temp_string = make_full_ref_name(instance_name_prefix, NULL, NULL, var_declare->children[0]->types.identifier, i);
00910
00911 sc_spot = sc_add_string(output_nets_sc, temp_string);
00912 if (output_nets_sc->data[sc_spot] != NULL)
00913 {
00914 error_message(NETLIST_ERROR, var_declare->children[0]->line_number, var_declare->children[0]->file_number, "Net (%s) with the same name already created\n", temp_string);
00915 }
00916
00917 output_nets_sc->data[sc_spot] = (void*)new_net;
00918 new_net->name = temp_string;
00919
00920
00921 new_pin = allocate_npin();
00922 new_node = allocate_nnode();
00923
00924 new_node->related_ast_node = var_declare;
00925 new_node->name = temp_string;
00926 new_node->type = INPUT_NODE;
00927
00928 allocate_more_node_output_pins(new_node, 1);
00929 add_output_port_information(new_node, 1);
00930
00931
00932 add_a_output_pin_to_node_spot_idx(new_node, new_pin, 0);
00933 add_a_driver_pin_to_net(new_net, new_pin);
00934
00935
00936 verilog_netlist->top_input_nodes = (nnode_t**)realloc(verilog_netlist->top_input_nodes, sizeof(nnode_t*)*(verilog_netlist->num_top_input_nodes+1));
00937 verilog_netlist->top_input_nodes[verilog_netlist->num_top_input_nodes] = new_node;
00938 verilog_netlist->num_top_input_nodes++;
00939 }
00940 }
00941 else if (var_declare->children[3] != NULL)
00942 {
00943
00944 oassert(FALSE);
00945 }
00946
00947 return new_net;
00948 }
00949
00950
00951
00952
00953
00954
00955 void create_symbol_table_for_module(ast_node_t* module_items)
00956 {
00957
00958 int i, j;
00959 char *temp_string;
00960 long sc_spot;
00961 oassert(module_items->type == MODULE_ITEMS);
00962
00963
00964 if (module_items->num_children > 0)
00965 {
00966 for (i = 0; i < module_items->num_children; i++)
00967 {
00968 if (module_items->children[i]->type == VAR_DECLARE_LIST)
00969 {
00970
00971 for (j = 0; j < module_items->children[i]->num_children; j++)
00972 {
00973 ast_node_t *var_declare = module_items->children[i]->children[j];
00974
00975
00976 if (var_declare->types.variable.is_parameter)
00977 continue;
00978
00979 oassert(module_items->children[i]->children[j]->type == VAR_DECLARE);
00980 oassert( (var_declare->types.variable.is_input) ||
00981 (var_declare->types.variable.is_output) ||
00982 (var_declare->types.variable.is_reg) ||
00983 (var_declare->types.variable.is_wire));
00984
00985
00986 temp_string = make_full_ref_name(NULL, NULL, NULL, var_declare->children[0]->types.identifier, -1);
00987
00988 sc_spot = sc_add_string(local_symbol_table_sc, temp_string);
00989 if (local_symbol_table_sc->data[sc_spot] != NULL)
00990 {
00991
00992
00993
00994
00995 if ((var_declare->types.variable.is_input) &&
00996 ((((ast_node_t*)local_symbol_table_sc->data[sc_spot])->types.variable.is_reg) || (((ast_node_t*)local_symbol_table_sc->data[sc_spot])->types.variable.is_wire)))
00997 {
00998 error_message(NETLIST_ERROR, var_declare->line_number, var_declare->file_number, "Input defined as wire or reg means it is a driver in this module. Not possible\n");
00999 }
01000
01001 else if (var_declare->types.variable.is_output)
01002 {
01003
01004 ((ast_node_t*)local_symbol_table_sc->data[sc_spot])->types.variable.is_output = TRUE;
01005 }
01006 else if ((var_declare->types.variable.is_reg) || (var_declare->types.variable.is_wire))
01007 {
01008
01009 ((ast_node_t*)local_symbol_table_sc->data[sc_spot])->types.variable.is_wire = var_declare->types.variable.is_wire;
01010 ((ast_node_t*)local_symbol_table_sc->data[sc_spot])->types.variable.is_reg = var_declare->types.variable.is_reg;
01011 }
01012 }
01013 else
01014 {
01015
01016 local_symbol_table_sc->data[sc_spot] = (void*)var_declare;
01017
01018
01019 local_symbol_table = (ast_node_t **)realloc(local_symbol_table, sizeof(ast_node_t*)*(num_local_symbol_table+1));
01020 local_symbol_table[num_local_symbol_table] = var_declare;
01021 num_local_symbol_table ++;
01022 }
01023 free(temp_string);
01024 }
01025 }
01026 }
01027 }
01028 else
01029 {
01030 error_message(NETLIST_ERROR, module_items->line_number, module_items->file_number, "Empty module\n");
01031 }
01032 }
01033
01034 #ifdef VPR6
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044 void connect_memory_and_alias(ast_node_t* hb_instance, char *instance_name_prefix)
01045 {
01046 t_model *hb_model;
01047 ast_node_t *hb_connect_list;
01048 int i, j;
01049 long sc_spot_output;
01050 long sc_spot_input_new, sc_spot_input_old;
01051
01052
01053 hb_model = find_hard_block(hb_instance->children[0]->types.identifier);
01054 if (hb_model == NULL)
01055 {
01056 printf("Found Hard Block %s: Not supported by FPGA Architecture\n", hb_instance->children[0]->types.identifier);
01057 oassert(FALSE);
01058 }
01059
01060
01061 hb_connect_list = hb_instance->children[1]->children[1];
01062 for (i = 0; i < hb_connect_list->num_children; i++)
01063 {
01064 int port_size;
01065 enum PORTS port_dir;
01066 ast_node_t *hb_var_node = hb_connect_list->children[i]->children[0];
01067 ast_node_t *hb_instance_var_node = hb_connect_list->children[i]->children[1];
01068
01069
01070 port_dir = hard_block_port_direction(hb_model, hb_var_node->types.identifier);
01071 if ((port_dir == OUT_PORT) || (port_dir == INOUT_PORT))
01072 {
01073 char *name_of_hb_input;
01074 char *full_name;
01075 char *alias_name;
01076
01077 name_of_hb_input = get_name_of_pin_at_bit(hb_instance_var_node, -1);
01078 full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, name_of_hb_input, -1);
01079 free(name_of_hb_input);
01080 alias_name = make_full_ref_name(instance_name_prefix, hb_instance->children[0]->types.identifier, hb_instance->children[1]->children[0]->types.identifier, hb_connect_list->children[i]->children[0]->types.identifier, -1);
01081
01082
01083 port_size = get_memory_port_size(alias_name);
01084 free(alias_name);
01085 oassert(port_size != 0);
01086
01087 for (j = 0; j < port_size; j++)
01088 {
01089
01090
01091
01092
01093
01094 if (port_size > 1)
01095 {
01096 name_of_hb_input = get_name_of_pin_at_bit(hb_instance_var_node, j);
01097 full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, name_of_hb_input, -1);
01098 free(name_of_hb_input);
01099
01100 alias_name = make_full_ref_name(instance_name_prefix, hb_instance->children[0]->types.identifier, hb_instance->children[1]->children[0]->types.identifier, hb_connect_list->children[i]->children[0]->types.identifier, j);
01101 }
01102 else
01103 {
01104 oassert(j == 0);
01105 name_of_hb_input = get_name_of_pin_at_bit(hb_instance_var_node, -1);
01106 full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, name_of_hb_input, -1);
01107 free(name_of_hb_input);
01108
01109 alias_name = make_full_ref_name(instance_name_prefix, hb_instance->children[0]->types.identifier, hb_instance->children[1]->children[0]->types.identifier, hb_connect_list->children[i]->children[0]->types.identifier, -1);
01110 }
01111
01112
01113 sc_spot_input_old = sc_lookup_string(input_nets_sc, alias_name);
01114
01115
01116 if ((sc_spot_output = sc_lookup_string(output_nets_sc, full_name)) == -1)
01117 {
01118
01119
01120 if ((sc_spot_input_new = sc_lookup_string(input_nets_sc, full_name)) == -1)
01121 {
01122
01123
01124 sc_spot_input_new = sc_add_string(input_nets_sc, full_name);
01125
01126 input_nets_sc->data[sc_spot_input_new] = input_nets_sc->data[sc_spot_input_old];
01127 }
01128 else
01129 {
01130
01131 combine_nets((nnet_t*)input_nets_sc->data[sc_spot_input_old], (nnet_t*)input_nets_sc->data[sc_spot_input_new], verilog_netlist);
01132 }
01133 }
01134 else
01135 {
01136
01137
01138 nnet_t* net = (nnet_t*)output_nets_sc->data[sc_spot_output];
01139 nnet_t* in_net = (nnet_t*)input_nets_sc->data[sc_spot_input_old];
01140
01141
01142
01143 in_net->name = net->name;
01144 combine_nets(net, in_net, verilog_netlist);
01145
01146
01147
01148 input_nets_sc->data[sc_spot_input_old] = (void*)in_net;
01149 output_nets_sc->data[sc_spot_output] = (void*)in_net;
01150
01151
01152
01153 sc_spot_input_new = sc_add_string(input_nets_sc, full_name);
01154
01155 input_nets_sc->data[sc_spot_input_new] = (void *)in_net;
01156 }
01157
01158 free(full_name);
01159 free(alias_name);
01160 }
01161 }
01162 }
01163
01164 return;
01165 }
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177 void connect_hard_block_and_alias(ast_node_t* hb_instance, char *instance_name_prefix)
01178 {
01179 t_model *hb_model;
01180 ast_node_t *hb_connect_list;
01181 int i, j;
01182 long sc_spot_output;
01183 long sc_spot_input_new, sc_spot_input_old;
01184
01185
01186 hb_model = find_hard_block(hb_instance->children[0]->types.identifier);
01187 if (hb_model == NULL)
01188 {
01189 printf("Found Hard Block %s: Not supported by FPGA Architecture\n", hb_instance->children[0]->types.identifier);
01190 oassert(FALSE);
01191 }
01192
01193
01194 hb_connect_list = hb_instance->children[1]->children[1];
01195 for (i = 0; i < hb_connect_list->num_children; i++)
01196 {
01197 int port_size;
01198 enum PORTS port_dir;
01199 ast_node_t *hb_var_node = hb_connect_list->children[i]->children[0];
01200 ast_node_t *hb_instance_var_node = hb_connect_list->children[i]->children[1];
01201
01202
01203 port_dir = hard_block_port_direction(hb_model, hb_var_node->types.identifier);
01204 if ((port_dir == OUT_PORT) || (port_dir == INOUT_PORT))
01205 {
01206 port_size = hard_block_port_size(hb_model, hb_var_node->types.identifier);
01207 oassert(port_size != 0);
01208
01209 for (j = 0; j < port_size; j++)
01210 {
01211
01212
01213
01214
01215 char *name_of_hb_input;
01216 char *full_name;
01217 char *alias_name;
01218
01219
01220 if (port_size > 1)
01221 {
01222 name_of_hb_input = get_name_of_pin_at_bit(hb_instance_var_node, j);
01223 full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, name_of_hb_input, -1);
01224 free(name_of_hb_input);
01225
01226 alias_name = make_full_ref_name(instance_name_prefix, hb_instance->children[0]->types.identifier, hb_instance->children[1]->children[0]->types.identifier, hb_connect_list->children[i]->children[0]->types.identifier, j);
01227 }
01228 else
01229 {
01230 oassert(j == 0);
01231 name_of_hb_input = get_name_of_pin_at_bit(hb_instance_var_node, -1);
01232 full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, name_of_hb_input, -1);
01233 free(name_of_hb_input);
01234
01235 alias_name = make_full_ref_name(instance_name_prefix, hb_instance->children[0]->types.identifier, hb_instance->children[1]->children[0]->types.identifier, hb_connect_list->children[i]->children[0]->types.identifier, -1);
01236 }
01237
01238
01239 sc_spot_input_old = sc_lookup_string(input_nets_sc, alias_name);
01240
01241
01242 if ((sc_spot_output = sc_lookup_string(output_nets_sc, full_name)) == -1)
01243 {
01244
01245
01246 if ((sc_spot_input_new = sc_lookup_string(input_nets_sc, full_name)) == -1)
01247 {
01248
01249
01250 sc_spot_input_new = sc_add_string(input_nets_sc, full_name);
01251
01252 input_nets_sc->data[sc_spot_input_new] = input_nets_sc->data[sc_spot_input_old];
01253 }
01254 else
01255 {
01256
01257 combine_nets((nnet_t*)input_nets_sc->data[sc_spot_input_old], (nnet_t*)input_nets_sc->data[sc_spot_input_new], verilog_netlist);
01258 }
01259 }
01260 else
01261 {
01262
01263
01264 nnet_t* net = (nnet_t*)output_nets_sc->data[sc_spot_output];
01265 nnet_t* in_net = (nnet_t*)input_nets_sc->data[sc_spot_input_old];
01266
01267
01268
01269 in_net->name = net->name;
01270 combine_nets(net, in_net, verilog_netlist);
01271
01272
01273
01274 input_nets_sc->data[sc_spot_input_old] = (void*)in_net;
01275 output_nets_sc->data[sc_spot_output] = (void*)in_net;
01276
01277
01278
01279 sc_spot_input_new = sc_add_string(input_nets_sc, full_name);
01280
01281 input_nets_sc->data[sc_spot_input_new] = (void *)in_net;
01282 }
01283
01284 free(full_name);
01285 free(alias_name);
01286 }
01287 }
01288 }
01289
01290 return;
01291 }
01292 #endif
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309 void connect_module_instantiation_and_alias(short PASS, ast_node_t* module_instance, char *instance_name_prefix)
01310 {
01311 int i, j;
01312 ast_node_t *module_node;
01313 ast_node_t *module_list;
01314 ast_node_t *module_instance_list = module_instance->children[1]->children[1];
01315 long sc_spot;
01316 long sc_spot_output;
01317 long sc_spot_input_old;
01318 long sc_spot_input_new;
01319
01320
01321 if ((sc_spot = sc_add_string(module_names_to_idx, module_instance->children[0]->types.identifier)) == -1)
01322 {
01323 error_message(NETLIST_ERROR, module_instance->line_number, module_instance->file_number, "Can't find module %s\n", module_instance->children[0]->types.identifier);
01324 }
01325 module_node = (ast_node_t*)module_names_to_idx->data[sc_spot];
01326 module_list = module_node->children[1];
01327
01328 if (module_list->num_children != module_instance_list->num_children)
01329 {
01330 error_message(NETLIST_ERROR, module_instance->line_number, module_instance->file_number, "Module instantiation (%s) and definition don't match in terms of ports\n", module_instance->children[0]->types.identifier);
01331 }
01332
01333 for (i = 0; i < module_list->num_children; i++)
01334 {
01335 int port_size;
01336 ast_node_t *module_var_node = module_list->children[i]->children[0];
01337 ast_node_t *module_instance_var_node = module_instance_list->children[i]->children[1];
01338
01339 if (
01340 ((PASS == INSTANTIATE_DRIVERS) && (module_list->children[i]->children[0]->types.variable.is_input))
01341 ||
01342 ((PASS == ALIAS_INPUTS) && (module_list->children[i]->children[0]->types.variable.is_output))
01343 )
01344 {
01345 continue;
01346 }
01347
01348
01349 if (module_var_node->children[1] == NULL)
01350 {
01351 port_size = 1;
01352 }
01353 else if (module_var_node->children[3] == NULL)
01354 {
01355
01356 oassert(module_var_node->children[2]->types.number.value <= module_var_node->children[1]->types.number.value);
01357 port_size = module_var_node->children[1]->types.number.value - module_var_node->children[2]->types.number.value +1;
01358 }
01359 else if (module_var_node->children[3] != NULL)
01360 {
01361
01362 oassert(FALSE);
01363 }
01364
01365 for (j = 0; j < port_size; j++)
01366 {
01367 if (module_list->children[i]->children[0]->types.variable.is_input)
01368 {
01369
01370
01371
01372 char *name_of_module_instance_of_input;
01373 char *full_name;
01374 char *alias_name;
01375
01376 if (port_size > 1)
01377 {
01378
01379 name_of_module_instance_of_input = get_name_of_pin_at_bit(module_instance_var_node, j);
01380 full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, name_of_module_instance_of_input, -1);
01381 free(name_of_module_instance_of_input);
01382
01383
01384 name_of_module_instance_of_input = get_name_of_var_declare_at_bit(module_list->children[i]->children[0], j);
01385 alias_name = make_full_ref_name(instance_name_prefix, module_instance->children[0]->types.identifier, module_instance->children[1]->children[0]->types.identifier, name_of_module_instance_of_input, -1);
01386 free(name_of_module_instance_of_input);
01387 }
01388 else
01389 {
01390 oassert(j == 0);
01391
01392
01393 name_of_module_instance_of_input = get_name_of_pin_at_bit(module_instance_var_node, -1);
01394 full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, name_of_module_instance_of_input, -1);
01395 free(name_of_module_instance_of_input);
01396
01397 name_of_module_instance_of_input = get_name_of_var_declare_at_bit(module_list->children[i]->children[0], 0);
01398 alias_name = make_full_ref_name(instance_name_prefix, module_instance->children[0]->types.identifier, module_instance->children[1]->children[0]->types.identifier, name_of_module_instance_of_input, -1);
01399 free(name_of_module_instance_of_input);
01400 }
01401
01402
01403 if ((sc_spot_input_old = sc_lookup_string(input_nets_sc, alias_name)) == -1)
01404 {
01405
01406 error_message(NETLIST_ERROR, module_instance->line_number, module_instance->file_number, "This module port %s is unused in module %s", alias_name, module_node->children[0]->types.identifier);
01407 }
01408
01409
01410 if ((sc_spot_output = sc_lookup_string(output_nets_sc, full_name)) == -1)
01411 {
01412
01413 if ((sc_spot_input_new = sc_lookup_string(input_nets_sc, full_name)) == -1)
01414 {
01415
01416 sc_spot_input_new = sc_add_string(input_nets_sc, full_name);
01417
01418
01419 input_nets_sc->data[sc_spot_input_new] = input_nets_sc->data[sc_spot_input_old];
01420 }
01421 else
01422 {
01423
01424 combine_nets((nnet_t*)input_nets_sc->data[sc_spot_input_old], (nnet_t*)input_nets_sc->data[sc_spot_input_new], verilog_netlist);
01425 }
01426 }
01427 else
01428 {
01429
01430 nnet_t* net = (nnet_t*)output_nets_sc->data[sc_spot_output];
01431 nnet_t* in_net = (nnet_t*)input_nets_sc->data[sc_spot_input_old];
01432
01433 if ((net != in_net) && (net->combined == TRUE))
01434 {
01435
01436 join_nets(net, in_net);
01437
01438 input_nets_sc->data[sc_spot_input_old] = (void*)net;
01439 }
01440 else if ((net != in_net) && (net->combined == FALSE))
01441 {
01442
01443 combine_nets(net, in_net, verilog_netlist);
01444
01445 output_nets_sc->data[sc_spot_output] = (void*)in_net;
01446 }
01447 }
01448
01449
01450 if (module_instance_list->children[i]->children[0] != NULL)
01451 {
01452 if (strcmp(module_instance_list->children[i]->children[0]->types.identifier, module_list->children[i]->children[0]->children[0]->types.identifier) != 0)
01453 {
01454 error_message(NETLIST_ERROR, module_list->children[i]->children[0]->line_number, module_list->children[i]->children[0]->file_number, "This module entry does not match up correctly (%s != %s). Odin expects the order of ports to be the same\n", module_instance_list->children[i]->children[0]->types.identifier, module_list->children[i]->children[0]->children[0]->types.identifier);
01455 }
01456 }
01457
01458 free(full_name);
01459 free(alias_name);
01460 }
01461 else if (module_list->children[i]->children[0]->types.variable.is_output)
01462 {
01463
01464 char *name_of_module_instance_of_input;
01465 char *full_name;
01466 char *alias_name;
01467
01468
01469 if (port_size > 1)
01470 {
01471
01472 name_of_module_instance_of_input = get_name_of_pin_at_bit(module_instance_var_node, j);
01473 full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, name_of_module_instance_of_input, -1);
01474 free(name_of_module_instance_of_input);
01475
01476 name_of_module_instance_of_input = get_name_of_var_declare_at_bit(module_list->children[i]->children[0], j);
01477 alias_name = make_full_ref_name(instance_name_prefix, module_instance->children[0]->types.identifier, module_instance->children[1]->children[0]->types.identifier, name_of_module_instance_of_input, -1);
01478 free(name_of_module_instance_of_input);
01479 }
01480 else
01481 {
01482 oassert(j == 0);
01483
01484 name_of_module_instance_of_input = get_name_of_pin_at_bit(module_instance_var_node, -1);
01485 full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, name_of_module_instance_of_input, -1);
01486 free(name_of_module_instance_of_input);
01487
01488 name_of_module_instance_of_input = get_name_of_var_declare_at_bit(module_list->children[i]->children[0], 0);
01489 alias_name = make_full_ref_name(instance_name_prefix, module_instance->children[0]->types.identifier, module_instance->children[1]->children[0]->types.identifier, name_of_module_instance_of_input, -1);
01490 free(name_of_module_instance_of_input);
01491 }
01492
01493
01494 if ((sc_spot_output = sc_lookup_string(output_nets_sc, alias_name)) == -1)
01495 {
01496 error_message(NETLIST_ERROR, module_list->children[i]->children[0]->line_number, module_list->children[i]->children[0]->file_number, "This output (%s) must exist...must be an error\n", alias_name);
01497 }
01498
01499
01500 sc_spot_input_new = sc_add_string(output_nets_sc, full_name);
01501
01502
01503 output_nets_sc->data[sc_spot_input_new] = output_nets_sc->data[sc_spot_output];
01504
01505
01506 if (module_instance_list->children[i]->children[0] != NULL)
01507 {
01508 if (strcmp(module_instance_list->children[i]->children[0]->types.identifier, module_list->children[i]->children[0]->children[0]->types.identifier) != 0)
01509 {
01510 error_message(NETLIST_ERROR, module_list->children[i]->children[0]->line_number, module_list->children[i]->children[0]->file_number, "This module entry does not match up correctly (%s != %s). Odin expects the order of ports to be the same\n", module_instance_list->children[i]->children[0]->types.identifier, module_list->children[i]->children[0]->children[0]->types.identifier);
01511 }
01512 }
01513
01514 free(full_name);
01515 free(alias_name);
01516 }
01517 }
01518 }
01519 }
01520
01521
01522
01523
01524
01525
01526
01527
01528 signal_list_t *create_pins(ast_node_t* var_declare, char *name, char *instance_name_prefix)
01529 {
01530 int i;
01531 signal_list_t *return_sig_list = init_signal_list_structure();
01532 long sc_spot;
01533 long sc_spot_output;
01534 npin_t *new_pin;
01535 nnet_t *new_in_net;
01536 char_list_t *pin_lists;
01537
01538 if (name == NULL)
01539 {
01540
01541 pin_lists = get_name_of_pins_with_prefix(var_declare, instance_name_prefix);
01542 }
01543 else if (var_declare == NULL)
01544 {
01545
01546 pin_lists = (char_list_t*)malloc(sizeof(char_list_t)*1);
01547 pin_lists->strings = (char**)malloc(sizeof(char*));
01548 pin_lists->strings[0] = name;
01549 pin_lists->num_strings = 1;
01550 }
01551 else
01552 oassert(FALSE);
01553
01554 for (i = 0; i < pin_lists->num_strings; i++)
01555 {
01556 new_pin = allocate_npin();
01557 new_pin->name = pin_lists->strings[i];
01558
01559
01560 if (strstr(pin_lists->strings[i], "ONE_VCC_CNS") != NULL)
01561 {
01562 add_a_fanout_pin_to_net(verilog_netlist->one_net, new_pin);
01563 sc_spot = sc_add_string(input_nets_sc, pin_lists->strings[i]);
01564 input_nets_sc->data[sc_spot] = (void*)verilog_netlist->one_net;
01565 }
01566 else if (strstr(pin_lists->strings[i], "ZERO_GND_ZERO") != NULL)
01567 {
01568 add_a_fanout_pin_to_net(verilog_netlist->zero_net, new_pin);
01569 sc_spot = sc_add_string(input_nets_sc, pin_lists->strings[i]);
01570 input_nets_sc->data[sc_spot] = (void*)verilog_netlist->zero_net;
01571 }
01572 else
01573 {
01574
01575 if ((sc_spot = sc_lookup_string(input_nets_sc, pin_lists->strings[i])) == -1)
01576 {
01577 new_in_net = allocate_nnet();
01578
01579 sc_spot = sc_add_string(input_nets_sc, pin_lists->strings[i]);
01580 input_nets_sc->data[sc_spot] = (void*)new_in_net;
01581 }
01582
01583
01584 add_a_fanout_pin_to_net((nnet_t*)input_nets_sc->data[sc_spot], new_pin);
01585
01586 if ((sc_spot_output = sc_lookup_string(output_nets_sc, pin_lists->strings[i])) != -1)
01587 {
01588
01589 nnet_t* net = (nnet_t*)output_nets_sc->data[sc_spot_output];
01590 if ((net != (nnet_t*)input_nets_sc->data[sc_spot]) && (net->combined == TRUE))
01591 {
01592
01593 join_nets(net, (nnet_t*)input_nets_sc->data[sc_spot]);
01594
01595 input_nets_sc->data[sc_spot] = (void*)net;
01596 }
01597 else if ((net != (nnet_t*)input_nets_sc->data[sc_spot]) && (net->combined == FALSE))
01598 {
01599
01600 combine_nets(net, (nnet_t*)input_nets_sc->data[sc_spot], verilog_netlist);
01601
01602 output_nets_sc->data[sc_spot_output] = (void*)input_nets_sc->data[sc_spot];
01603 }
01604 }
01605 }
01606
01607
01608 add_pin_to_signal_list(return_sig_list, new_pin);
01609 }
01610
01611 return return_sig_list;
01612 }
01613
01614
01615
01616
01617
01618
01619
01620 signal_list_t *create_output_pin(ast_node_t* var_declare, char *instance_name_prefix)
01621 {
01622 char *name_of_pin;
01623 char *full_name;
01624 signal_list_t *return_sig_list = init_signal_list_structure();
01625 npin_t *new_pin;
01626
01627
01628 name_of_pin = get_name_of_pin_at_bit(var_declare, -1);
01629 full_name = make_full_ref_name(instance_name_prefix, NULL, NULL, name_of_pin, -1);
01630 free(name_of_pin);
01631
01632 new_pin = allocate_npin();
01633 new_pin->name = full_name;
01634
01635 add_pin_to_signal_list(return_sig_list, new_pin);
01636
01637 return return_sig_list;
01638 }
01639
01640
01641
01642
01643 signal_list_t *assignment_alias(ast_node_t* assignment, char *instance_name_prefix)
01644 {
01645 signal_list_t *in_1;
01646 signal_list_t *return_list;
01647 char_list_t *out_list;
01648 int i;
01649 int output_size;
01650
01651
01652 in_1 = netlist_expand_ast_of_module(assignment->children[1], instance_name_prefix);
01653 oassert(in_1 != NULL);
01654 out_list = get_name_of_pins_with_prefix(assignment->children[0], instance_name_prefix);
01655 oassert(out_list != NULL);
01656 oassert(out_list->strings != NULL);
01657
01658
01659 output_size = alias_output_assign_pins_to_inputs(out_list, in_1, assignment);
01660
01661 if (output_size < in_1->signal_list_size)
01662 {
01663 return_list = init_signal_list_structure();
01664
01665 for (i = 0; i < output_size; i++)
01666 {
01667 add_pin_to_signal_list(return_list, in_1->signal_list[i]);
01668 }
01669
01670 clean_signal_list_structure(in_1);
01671 }
01672 else
01673 {
01674 return_list = in_1;
01675 }
01676
01677
01678 free(out_list->strings);
01679 free(out_list);
01680
01681 return return_list;
01682 }
01683
01684
01685
01686
01687 void terminate_registered_assignment(ast_node_t *always_node, signal_list_t* assignment, signal_list_t *potential_clocks, char *instance_name_prefix)
01688 {
01689 int i;
01690 long sc_spot;
01691 npin_t *ff_input_pin;
01692 npin_t *ff_output_pin;
01693
01694 oassert(potential_clocks != NULL);
01695
01696
01697 if (local_clock_found == FALSE)
01698 {
01699 for (i = 0; i < potential_clocks->signal_list_size; i++)
01700 {
01701 nnet_t *temp_net;
01702
01703 if ((sc_spot = sc_lookup_string(output_nets_sc, potential_clocks->signal_list[i]->name)) == -1)
01704 {
01705 if ((sc_spot = sc_lookup_string(input_nets_sc, potential_clocks->signal_list[i]->name)) == -1)
01706 {
01707 error_message(NETLIST_ERROR, always_node->line_number, always_node->file_number, "Sensitivity list element (%s) is not a driver or net ... must be\n", potential_clocks->signal_list[i]->name);
01708 }
01709 temp_net = (nnet_t*)input_nets_sc->data[sc_spot];
01710 }
01711 else
01712 {
01713 temp_net = (nnet_t*)output_nets_sc->data[sc_spot];
01714 }
01715
01716
01717 if (
01718 (((temp_net->num_fanout_pins == 1) && (temp_net->fanout_pins[0]->node == NULL)) || (temp_net->num_fanout_pins == 0))
01719 && (local_clock_found == TRUE))
01720 {
01721 error_message(NETLIST_ERROR, always_node->line_number, always_node->file_number, "Suspected second clock (%s). In a sequential sensitivity list, Odin expects the clock not to drive anything and any other signals in this list to drive stuff. For example, a reset in the sensitivy list has to be hooked up to something in the always block.\n", potential_clocks->signal_list[i]->name);
01722 }
01723 else if (temp_net->num_fanout_pins == 0)
01724 {
01725
01726 local_clock_found = TRUE;
01727 local_clock_idx = i;
01728 }
01729 else if ((temp_net->num_fanout_pins == 1) && (temp_net->fanout_pins[0]->node == NULL))
01730 {
01731
01732 local_clock_found = TRUE;
01733 local_clock_idx = i;
01734 }
01735
01736 }
01737 }
01738
01739
01740 for (i = 0; i < assignment->signal_list_size; i++)
01741 {
01742 nnode_t *ff_node = allocate_nnode();
01743
01744 if ((sc_spot = sc_lookup_string(output_nets_sc, assignment->signal_list[i]->name)) == -1)
01745 {
01746 error_message(NETLIST_ERROR, always_node->line_number, always_node->file_number, "Assignment is missing driver (%s)\n", assignment->signal_list[i]->name);
01747 }
01748
01749
01750 ff_node->related_ast_node = always_node;
01751
01752 ff_node->type = FF_NODE;
01753
01754 ff_node->name = node_name(ff_node, instance_name_prefix);
01755
01756 allocate_more_node_input_pins(ff_node, 2);
01757 add_input_port_information(ff_node, 1);
01758 allocate_more_node_output_pins(ff_node, 1);
01759 add_output_port_information(ff_node, 1);
01760
01761
01762
01763 npin_t *fanout_pin_of_clock = allocate_npin();
01764 add_a_fanout_pin_to_net(potential_clocks->signal_list[local_clock_idx]->net, fanout_pin_of_clock);
01765 add_a_input_pin_to_node_spot_idx(ff_node, fanout_pin_of_clock, 1);
01766
01767
01768 ff_input_pin = assignment->signal_list[i];
01769 add_a_input_pin_to_node_spot_idx(ff_node, assignment->signal_list[i], 0);
01770
01771
01772 ff_output_pin = allocate_npin();
01773 add_a_output_pin_to_node_spot_idx(ff_node, ff_output_pin, 0);
01774 add_a_driver_pin_to_net((nnet_t*)output_nets_sc->data[sc_spot], ff_output_pin);
01775
01776 verilog_netlist->ff_nodes = (nnode_t**)realloc(verilog_netlist->ff_nodes, sizeof(nnode_t*)*(verilog_netlist->num_ff_nodes+1));
01777 verilog_netlist->ff_nodes[verilog_netlist->num_ff_nodes] = ff_node;
01778 verilog_netlist->num_ff_nodes++;
01779 }
01780
01781 clean_signal_list_structure(assignment);
01782 }
01783
01784
01785
01786
01787 void terminate_continuous_assignment(ast_node_t *node, signal_list_t* assignment, char *instance_name_prefix)
01788 {
01789 int i;
01790 long sc_spot;
01791 npin_t *buf_input_pin;
01792 npin_t *buf_output_pin;
01793
01794 for (i = 0; i < assignment->signal_list_size; i++)
01795 {
01796 nnode_t *buf_node;
01797
01798
01799 if ((sc_spot = sc_lookup_string(output_nets_sc, assignment->signal_list[i]->name)) == -1)
01800 {
01801 error_message(NETLIST_ERROR, node->line_number, node->file_number, "Assignment (%s) is missing driver\n", assignment->signal_list[i]->name);
01802 }
01803
01804
01805 if (((nnet_t*)output_nets_sc->data[sc_spot])->name == NULL)
01806 {
01807 ((nnet_t*)output_nets_sc->data[sc_spot])->name = assignment->signal_list[i]->name;
01808 }
01809
01810 buf_node = allocate_nnode();
01811 buf_node->type = BUF_NODE;
01812
01813 buf_node->name = node_name(buf_node, instance_name_prefix);
01814
01815 buf_node->related_ast_node = node;
01816
01817 allocate_more_node_input_pins(buf_node, 1);
01818 add_input_port_information(buf_node, 1);
01819 allocate_more_node_output_pins(buf_node, 1);
01820 add_output_port_information(buf_node, 1);
01821
01822
01823 buf_input_pin = assignment->signal_list[i];
01824 add_a_input_pin_to_node_spot_idx(buf_node, buf_input_pin, 0);
01825
01826
01827 buf_output_pin = allocate_npin();
01828 add_a_output_pin_to_node_spot_idx(buf_node, buf_output_pin, 0);
01829 if(((nnet_t*)output_nets_sc->data[sc_spot])->driver_pin != NULL)
01830 {
01831 error_message(NETLIST_ERROR, node->line_number, node->file_number, "You've defined this driver %s twice (i.e. in the statement block you've probably put the statement as a = b; a = c; in some form that's incorrect)\n", assignment->signal_list[i]->name);
01832 }
01833 add_a_driver_pin_to_net((nnet_t*)output_nets_sc->data[sc_spot], buf_output_pin);
01834 }
01835
01836 clean_signal_list_structure(assignment);
01837 }
01838
01839
01840
01841
01842
01843 int alias_output_assign_pins_to_inputs(char_list_t *output_list, signal_list_t *input_list, ast_node_t *node)
01844 {
01845 int i;
01846
01847 if (output_list->num_strings >= input_list->signal_list_size)
01848 {
01849 for (i = 0; i < input_list->signal_list_size; i++)
01850 {
01851 input_list->signal_list[i]->name = output_list->strings[i];
01852 }
01853 for (i = input_list->signal_list_size; i < output_list->num_strings; i++)
01854 {
01855 warning_message(NETLIST_ERROR, node->line_number, node->file_number, "More nets to drive then drivers, padding with ZEROs for driver %s\n", output_list->strings[i]);
01856 add_pin_to_signal_list(input_list, get_a_zero_pin(verilog_netlist));
01857 input_list->signal_list[i]->name = output_list->strings[i];
01858 }
01859
01860 return output_list->num_strings;
01861 }
01862 else
01863 {
01864 for (i = 0; i < output_list->num_strings; i++)
01865 {
01866 input_list->signal_list[i]->name = output_list->strings[i];
01867 }
01868 warning_message(NETLIST_ERROR, node->line_number, node->file_number, "May be a warning: appears that there are more driver pins then nets to drive, sometimes using decimal numbers causes this problem\n");
01869 return output_list->num_strings;
01870 }
01871 }
01872
01873
01874
01875
01876
01877
01878 signal_list_t *create_gate(ast_node_t* gate, char *instance_name_prefix)
01879 {
01880 signal_list_t *in_1, *in_2, *out_1;
01881 nnode_t *gate_node;
01882 ast_node_t *gate_instance = gate->children[0];
01883
01884 if (gate_instance->children[3] == NULL)
01885 {
01886
01887
01888
01889 in_1 = netlist_expand_ast_of_module(gate_instance->children[2], instance_name_prefix);
01890
01891 out_1 = create_output_pin(gate_instance->children[1], instance_name_prefix);
01892 oassert((in_1 != NULL) && (out_1 != NULL));
01893
01894
01895 gate_node = allocate_nnode();
01896
01897 gate_node->related_ast_node = gate;
01898 gate_node->type = gate->types.operation.op;
01899 oassert(gate_node->type > 0);
01900 gate_node->name = node_name(gate_node, instance_name_prefix);
01901
01902 allocate_more_node_input_pins(gate_node, 1);
01903 add_input_port_information(gate_node, 1);
01904 allocate_more_node_output_pins(gate_node, 1);
01905 add_output_port_information(gate_node, 1);
01906
01907
01908 hookup_input_pins_from_signal_list(gate_node, 0, in_1, 0, 1, verilog_netlist);
01909
01910 hookup_output_pins_from_signal_list(gate_node, 0, out_1, 0, 1);
01911
01912 clean_signal_list_structure(in_1);
01913 }
01914 else
01915 {
01916
01917
01918
01919 in_1 = netlist_expand_ast_of_module(gate_instance->children[2], instance_name_prefix);
01920 in_2 = netlist_expand_ast_of_module(gate_instance->children[3], instance_name_prefix);
01921
01922 out_1 = create_output_pin(gate_instance->children[1], instance_name_prefix);
01923 oassert((in_1 != NULL) && (in_2 != NULL) && (out_1 != NULL));
01924
01925
01926 gate_node = allocate_nnode();
01927
01928 gate_node->related_ast_node = gate;
01929 gate_node->type = gate->types.operation.op;
01930 oassert(gate_node->type > 0);
01931
01932 gate_node->name = node_name(gate_node, instance_name_prefix);
01933
01934 allocate_more_node_input_pins(gate_node, 2);
01935 add_input_port_information(gate_node, 1);
01936 add_input_port_information(gate_node, 1);
01937 allocate_more_node_output_pins(gate_node, 1);
01938 add_output_port_information(gate_node, 1);
01939
01940
01941 hookup_input_pins_from_signal_list(gate_node, 0, in_1, 0, 1, verilog_netlist);
01942 hookup_input_pins_from_signal_list(gate_node, 1, in_2, 0, 1, verilog_netlist);
01943
01944 hookup_output_pins_from_signal_list(gate_node, 0, out_1, 0, 1);
01945
01946 clean_signal_list_structure(in_1);
01947 clean_signal_list_structure(in_2);
01948 }
01949
01950 return out_1;
01951 }
01952
01953
01954
01955
01956
01957
01958 signal_list_t *create_operation_node(ast_node_t *op, signal_list_t **input_lists, int list_size, char *instance_name_prefix)
01959 {
01960 int i;
01961 signal_list_t *return_list = init_signal_list_structure();
01962 nnode_t *operation_node;
01963 int max_input_port_width = -1;
01964 int output_port_width = -1;
01965 int input_port_width = -1;
01966 int current_idx;
01967
01968
01969 operation_node = allocate_nnode();
01970
01971 operation_node->related_ast_node = op;
01972 operation_node->type = op->types.operation.op;
01973 operation_node->name = node_name(operation_node, instance_name_prefix);
01974
01975 current_idx = 0;
01976
01977
01978 for (i = 0; i < list_size; i++)
01979 {
01980 if (max_input_port_width < input_lists[i]->signal_list_size)
01981 {
01982 max_input_port_width = input_lists[i]->signal_list_size;
01983 }
01984 }
01985
01986 switch(operation_node->type)
01987 {
01988 case BITWISE_NOT:
01989
01990 output_port_width = max_input_port_width;
01991 input_port_width = output_port_width;
01992 break;
01993 case ADD:
01994
01995 output_port_width = max_input_port_width;
01996 input_port_width = output_port_width;
01997 break;
01998 case MINUS:
01999
02000 output_port_width = max_input_port_width;
02001 input_port_width = output_port_width;
02002 break;
02003 case MULTIPLY:
02004
02005 output_port_width = input_lists[0]->signal_list_size + input_lists[1]->signal_list_size;
02006 input_port_width = -2;
02007
02008
02009 mult_list = insert_in_vptr_list(mult_list, operation_node);
02010 break;
02011 case BITWISE_AND:
02012 case BITWISE_OR:
02013 case BITWISE_NAND:
02014 case BITWISE_NOR:
02015 case BITWISE_XNOR:
02016 case BITWISE_XOR:
02017
02018 if (list_size == 2)
02019 {
02020 output_port_width = max_input_port_width;
02021 input_port_width = output_port_width;
02022 }
02023 else
02024 {
02025 oassert(list_size == 1);
02026
02027 output_port_width = 1;
02028 input_port_width = max_input_port_width;
02029 }
02030 break;
02031 case SR:
02032 case SL:
02033
02034 output_port_width = max_input_port_width;
02035 input_port_width = -2;
02036 break;
02037 case LOGICAL_NOT:
02038 case LOGICAL_OR:
02039 case LOGICAL_AND:
02040
02041 output_port_width = 1;
02042 input_port_width = max_input_port_width;
02043 break;
02044 case LT:
02045 case GT:
02046 case LOGICAL_EQUAL:
02047 case NOT_EQUAL:
02048 case LTE:
02049 case GTE:
02050 {
02051 if (input_lists[0]->signal_list_size != input_lists[1]->signal_list_size)
02052 {
02053 int index_of_smallest = find_smallest_non_numerical(op, input_lists, 2);
02054
02055 input_port_width = input_lists[index_of_smallest]->signal_list_size;
02056
02057
02058 pad_with_zeros(op, input_lists[0], input_port_width, instance_name_prefix);
02059 pad_with_zeros(op, input_lists[1], input_port_width, instance_name_prefix);
02060 }
02061 else
02062 {
02063 input_port_width = input_lists[0]->signal_list_size;
02064 }
02065 output_port_width = 1;
02066 break;
02067 }
02068 case DIVIDE:
02069 case MODULO:
02070 default:
02071 error_message(NETLIST_ERROR, op->line_number, op->file_number, "Operation not supported by Odin\n");
02072 break;
02073 }
02074
02075 oassert(input_port_width != -1);
02076 oassert(output_port_width != -1);
02077
02078 for (i = 0; i < list_size; i++)
02079 {
02080 if ((operation_node->type == SR) || (operation_node->type == SL))
02081 {
02082
02083 if (i == 0)
02084 {
02085
02086 allocate_more_node_input_pins(operation_node, input_lists[i]->signal_list_size);
02087
02088 add_input_port_information(operation_node, input_lists[i]->signal_list_size);
02089
02090 hookup_input_pins_from_signal_list(operation_node, current_idx, input_lists[i], 0, input_lists[i]->signal_list_size, verilog_netlist);
02091 }
02092 }
02093 else if (input_port_width != -2)
02094 {
02095
02096
02097 allocate_more_node_input_pins(operation_node, input_port_width);
02098
02099 add_input_port_information(operation_node, input_port_width);
02100
02101
02102 hookup_input_pins_from_signal_list(operation_node, current_idx, input_lists[i], 0, input_port_width, verilog_netlist);
02103 current_idx += input_port_width;
02104 }
02105 else
02106 {
02107
02108
02109 allocate_more_node_input_pins(operation_node, input_lists[i]->signal_list_size);
02110
02111 add_input_port_information(operation_node, input_lists[i]->signal_list_size);
02112
02113
02114 hookup_input_pins_from_signal_list(operation_node, current_idx, input_lists[i], 0, input_lists[i]->signal_list_size, verilog_netlist);
02115
02116 current_idx += input_lists[i]->signal_list_size;
02117 }
02118
02119
02120 }
02121
02122 allocate_more_node_output_pins(operation_node, output_port_width);
02123 add_output_port_information(operation_node, output_port_width);
02124
02125
02126 for (i = 0; i < output_port_width; i++)
02127 {
02128 npin_t *new_pin1;
02129 npin_t *new_pin2;
02130 nnet_t *new_net;
02131 new_pin1 = allocate_npin();
02132 new_pin2 = allocate_npin();
02133 new_net = allocate_nnet();
02134 new_net->name = operation_node->name;
02135
02136 add_a_output_pin_to_node_spot_idx(operation_node, new_pin1, i);
02137
02138 add_a_driver_pin_to_net(new_net, new_pin1);
02139
02140 add_a_fanout_pin_to_net(new_net, new_pin2);
02141
02142
02143 add_pin_to_signal_list(return_list, new_pin2);
02144 }
02145
02146 for (i = 0; i < list_size; i++)
02147 {
02148 clean_signal_list_structure(input_lists[i]);
02149 }
02150
02151 return return_list;
02152 }
02153
02154
02155
02156
02157 signal_list_t *evaluate_sensitivity_list(ast_node_t *delay_control, char *instance_name_prefix)
02158 {
02159 int i;
02160 short edge_type = -1;
02161 signal_list_t *return_sig_list = init_signal_list_structure();
02162 signal_list_t *temp_list;
02163
02164 oassert(delay_control->type == DELAY_CONTROL);
02165
02166 for (i = 0; i < delay_control->num_children; i++)
02167 {
02168 if ( ((delay_control->children[i]->type == NEGEDGE) || (delay_control->children[i]->type == POSEDGE))
02169 &&
02170 ((edge_type == -1) || (edge_type == SEQUENTIAL)))
02171 {
02172 edge_type = SEQUENTIAL;
02173
02174 temp_list = create_pins(delay_control->children[i]->children[0], NULL, instance_name_prefix);
02175 oassert(temp_list->signal_list_size == 1);
02176
02177 add_pin_to_signal_list(return_sig_list, temp_list->signal_list[0]);
02178 clean_signal_list_structure(temp_list);
02179 }
02180 else if ((edge_type == -1) || (edge_type == COMBINATIONAL))
02181 {
02182
02183 edge_type = COMBINATIONAL;
02184 }
02185 else
02186 {
02187 error_message(NETLIST_ERROR, delay_control->line_number, delay_control->file_number, "Sensitivity list switches from sequential and combinational. You can't define somthing like always @(posedgel clock or a).\n");
02188 }
02189 }
02190
02191
02192 if (edge_type == -1)
02193 {
02194 error_message(NETLIST_ERROR, delay_control->line_number, delay_control->file_number, "Sensitivity list error...looks empty?\n");
02195 }
02196 else if (edge_type == COMBINATIONAL)
02197 {
02198 clean_signal_list_structure(return_sig_list);
02199 return_sig_list = NULL;
02200 type_of_circuit = edge_type;
02201 }
02202 else if (edge_type == SEQUENTIAL)
02203 {
02204 type_of_circuit = edge_type;
02205 }
02206
02207 return return_sig_list;
02208 }
02209
02210
02211
02212
02213 signal_list_t *create_if_for_question(ast_node_t *if_ast, char *instance_name_prefix)
02214 {
02215 signal_list_t *return_list;
02216 nnode_t *if_node;
02217
02218
02219 if_node = allocate_nnode();
02220
02221 if_node->related_ast_node = if_ast;
02222 if_node->type = MULTI_PORT_MUX;
02223 if_node->name = node_name(if_node, instance_name_prefix);
02224
02225
02226 create_if_control_signals(if_ast->children[0], if_node, instance_name_prefix);
02227
02228
02229 return_list = create_if_question_mux_expressions(if_ast, if_node, instance_name_prefix);
02230
02231 return return_list;
02232 }
02233
02234
02235
02236
02237 signal_list_t *create_if_question_mux_expressions(ast_node_t *if_ast, nnode_t *if_node, char *instance_name_prefix)
02238 {
02239 signal_list_t **if_expressions;
02240 signal_list_t *return_list;
02241 int i;
02242
02243
02244 if_expressions = (signal_list_t**)malloc(sizeof(signal_list_t*)*2);
02245
02246
02247 for (i = 0; i < 2; i++)
02248 {
02249 if (if_ast->children[i+1] != NULL)
02250 {
02251
02252 if_expressions[i] = netlist_expand_ast_of_module(if_ast->children[i+1], instance_name_prefix);
02253 }
02254 else
02255 {
02256 error_message(NETLIST_ERROR, if_ast->line_number, if_ast->file_number, "No such thing as a a = b ? z;\n");
02257 }
02258 }
02259
02260
02261 return_list = create_mux_expressions(if_expressions, if_node, 2, instance_name_prefix);
02262
02263 return return_list;
02264 }
02265
02266
02267
02268
02269 signal_list_t *create_if(ast_node_t *if_ast, char *instance_name_prefix)
02270 {
02271 signal_list_t *return_list;
02272 nnode_t *if_node;
02273
02274
02275 if_node = allocate_nnode();
02276
02277 if_node->related_ast_node = if_ast;
02278 if_node->type = MULTI_PORT_MUX;
02279 if_node->name = node_name(if_node, instance_name_prefix);
02280
02281
02282 create_if_control_signals(if_ast->children[0], if_node, instance_name_prefix);
02283
02284
02285 return_list = create_if_mux_statements(if_ast, if_node, instance_name_prefix);
02286
02287 return return_list;
02288 }
02289
02290
02291
02292
02293 void create_if_control_signals(ast_node_t *if_expression, nnode_t *if_node, char *instance_name_prefix)
02294 {
02295 signal_list_t *if_logic_expression;
02296 signal_list_t *if_logic_expression_final;
02297 nnode_t *not_node;
02298 npin_t *not_pin;
02299 signal_list_t *out_pin_list;
02300
02301
02302 allocate_more_node_input_pins(if_node, 2);
02303
02304 add_input_port_information(if_node, 2);
02305
02306
02307 if_logic_expression = netlist_expand_ast_of_module(if_expression, instance_name_prefix);
02308 oassert(if_logic_expression != NULL);
02309
02310 if(if_logic_expression->signal_list_size != 1)
02311 {
02312 nnode_t *or_gate;
02313 signal_list_t *default_expression;
02314
02315 or_gate = make_1port_logic_gate_with_inputs(LOGICAL_OR, if_logic_expression->signal_list_size, if_logic_expression, if_node, -1);
02316 default_expression = make_output_pins_for_existing_node(or_gate, 1);
02317
02318
02319 add_a_input_pin_to_node_spot_idx(if_node, default_expression->signal_list[0], 0);
02320
02321 if_logic_expression_final = default_expression;
02322 }
02323 else
02324 {
02325
02326 add_a_input_pin_to_node_spot_idx(if_node, if_logic_expression->signal_list[0], 0);
02327 if_logic_expression_final = if_logic_expression;
02328 }
02329
02330
02331 not_pin = copy_input_npin(if_logic_expression_final->signal_list[0]);
02332
02333
02334 not_node = make_not_gate_with_input(not_pin, if_node, -1);
02335
02336
02337 out_pin_list = make_output_pins_for_existing_node(not_node, 1);
02338 oassert(out_pin_list->signal_list_size == 1);
02339
02340
02341 add_a_input_pin_to_node_spot_idx(if_node, out_pin_list->signal_list[0], 1);
02342
02343 clean_signal_list_structure(out_pin_list);
02344 }
02345
02346
02347
02348
02349 signal_list_t *create_if_mux_statements(ast_node_t *if_ast, nnode_t *if_node, char *instance_name_prefix)
02350 {
02351 signal_list_t **if_statements;
02352 signal_list_t *return_list;
02353 int i;
02354
02355
02356 if_statements = (signal_list_t**)malloc(sizeof(signal_list_t*)*2);
02357
02358
02359 for (i = 0; i < 2; i++)
02360 {
02361 if (if_ast->children[i+1] != NULL)
02362 {
02363
02364 if_statements[i] = netlist_expand_ast_of_module(if_ast->children[i+1], instance_name_prefix);
02365 sort_signal_list_alphabetically(if_statements[i]);
02366 }
02367 else
02368 {
02369
02370 if_statements[i] = init_signal_list_structure();
02371 }
02372 }
02373
02374
02375 return_list = create_mux_statements(if_statements, if_node, 2, instance_name_prefix);
02376
02377 return return_list;
02378 }
02379
02380
02381
02382
02383 signal_list_t *create_case(ast_node_t *case_ast, char *instance_name_prefix)
02384 {
02385 signal_list_t *return_list;
02386 nnode_t *case_node;
02387 ast_node_t *case_list_of_items;
02388 ast_node_t *case_match_input;
02389
02390
02391 case_node = allocate_nnode();
02392
02393 case_node->related_ast_node = case_ast;
02394 case_node->type = MULTI_PORT_MUX;
02395 case_node->name = node_name(case_node, instance_name_prefix);
02396
02397
02398 case_match_input = case_ast->children[0];
02399
02400
02401 case_list_of_items = case_ast->children[1];
02402
02403
02404 create_case_control_signals(case_list_of_items, case_match_input, case_node, instance_name_prefix);
02405
02406
02407 return_list = create_case_mux_statements(case_list_of_items, case_node, instance_name_prefix);
02408
02409 return return_list;
02410 }
02411
02412
02413
02414
02415 void create_case_control_signals(ast_node_t *case_list_of_items, ast_node_t *compare_against, nnode_t *case_node, char *instance_name_prefix)
02416 {
02417 int i;
02418 signal_list_t *other_expressions_pin_list = init_signal_list_structure();
02419
02420
02421 allocate_more_node_input_pins(case_node, case_list_of_items->num_children);
02422
02423 add_input_port_information(case_node, case_list_of_items->num_children);
02424
02425
02426 for (i = 0; i < case_list_of_items->num_children; i++)
02427 {
02428 if (case_list_of_items->children[i]->type == CASE_ITEM)
02429 {
02430
02431 signal_list_t *case_compare_expression;
02432 signal_list_t **case_compares = (signal_list_t **)malloc(sizeof(signal_list_t*)*2);
02433 ast_node_t *logical_equal = create_node_w_type(BINARY_OPERATION, -1, -1);
02434 logical_equal->types.operation.op = LOGICAL_EQUAL;
02435
02436
02437 case_compares[0] = netlist_expand_ast_of_module(compare_against, instance_name_prefix);
02438 case_compares[1] = netlist_expand_ast_of_module(case_list_of_items->children[i]->children[0], instance_name_prefix);
02439
02440
02441 case_compare_expression = create_operation_node(logical_equal, case_compares, 2, instance_name_prefix);
02442 oassert(case_compare_expression->signal_list_size == 1);
02443
02444
02445 add_a_input_pin_to_node_spot_idx(case_node, case_compare_expression->signal_list[0], i);
02446
02447
02448 add_pin_to_signal_list(other_expressions_pin_list, copy_input_npin(case_compare_expression->signal_list[0]));
02449
02450
02451 clean_signal_list_structure(case_compare_expression);
02452
02453 free(case_compares);
02454 }
02455 else if (case_list_of_items->children[i]->type == CASE_DEFAULT)
02456 {
02457
02458 nnode_t *default_node;
02459 signal_list_t *default_expression;
02460
02461 oassert(i == case_list_of_items->num_children - 1);
02462
02463
02464 default_node = make_1port_logic_gate_with_inputs(LOGICAL_NOR, case_list_of_items->num_children-1, other_expressions_pin_list, case_node, -1);
02465 default_expression = make_output_pins_for_existing_node(default_node, 1);
02466
02467
02468 add_a_input_pin_to_node_spot_idx(case_node, default_expression->signal_list[0], i);
02469 }
02470 else
02471 {
02472 oassert(FALSE);
02473 }
02474 }
02475 }
02476
02477
02478
02479
02480 signal_list_t *create_case_mux_statements(ast_node_t *case_list_of_items, nnode_t *case_node, char *instance_name_prefix)
02481 {
02482 signal_list_t **case_statement;
02483 signal_list_t *return_list;
02484 int i;
02485
02486
02487 case_statement = (signal_list_t**)malloc(sizeof(signal_list_t*)*(case_list_of_items->num_children));
02488
02489
02490 for (i = 0; i < case_list_of_items->num_children; i++)
02491 {
02492 if (case_list_of_items->children[i]->type == CASE_ITEM)
02493 {
02494
02495 case_statement[i] = netlist_expand_ast_of_module(case_list_of_items->children[i]->children[1], instance_name_prefix);
02496 sort_signal_list_alphabetically(case_statement[i]);
02497 }
02498 else if (case_list_of_items->children[i]->type == CASE_DEFAULT)
02499 {
02500 oassert(i == case_list_of_items->num_children - 1);
02501 case_statement[i] = netlist_expand_ast_of_module(case_list_of_items->children[i]->children[0], instance_name_prefix);
02502 sort_signal_list_alphabetically(case_statement[i]);
02503 }
02504 else
02505 {
02506 oassert(FALSE);
02507 }
02508 }
02509
02510
02511 return_list = create_mux_statements(case_statement, case_node, case_list_of_items->num_children, instance_name_prefix);
02512
02513 return return_list;
02514 }
02515
02516
02517
02518
02519 signal_list_t *create_mux_statements(signal_list_t **statement_lists, nnode_t *mux_node, int num_statement_lists, char *instance_name_prefix)
02520 {
02521 int i, j;
02522 signal_list_t *combined_lists;
02523 int *per_case_statement_idx;
02524 signal_list_t *return_list = init_signal_list_structure();
02525 int in_index = 1;
02526 int out_index = 0;
02527
02528
02529 per_case_statement_idx = (int*)calloc(sizeof(int), num_statement_lists);
02530
02531
02532 combined_lists = combine_lists_without_freeing_originals(statement_lists, num_statement_lists);
02533 sort_signal_list_alphabetically(combined_lists);
02534
02535 for (i = 0; i < combined_lists->signal_list_size; i++)
02536 {
02537 int i_skip = 0;
02538 npin_t *new_pin1;
02539 npin_t *new_pin2;
02540 nnet_t *new_net;
02541 new_pin1 = allocate_npin();
02542 new_pin2 = allocate_npin();
02543 new_net = allocate_nnet();
02544
02545
02546 allocate_more_node_input_pins(mux_node, num_statement_lists);
02547
02548 add_input_port_information(mux_node, num_statement_lists);
02549
02550
02551 allocate_more_node_output_pins(mux_node, 1);
02552 add_a_output_pin_to_node_spot_idx(mux_node, new_pin1, out_index);
02553
02554 add_a_driver_pin_to_net(new_net, new_pin1);
02555
02556 add_a_fanout_pin_to_net(new_net, new_pin2);
02557
02558 new_pin2->name = combined_lists->signal_list[i]->name;
02559
02560 add_pin_to_signal_list(return_list, new_pin2);
02561
02562
02563 for (j = 0; j < num_statement_lists; j++)
02564 {
02565
02566 if ((per_case_statement_idx[j] < statement_lists[j]->signal_list_size) && (strcmp(combined_lists->signal_list[i]->name, statement_lists[j]->signal_list[per_case_statement_idx[j]]->name) == 0))
02567 {
02568
02569 add_a_input_pin_to_node_spot_idx(mux_node, statement_lists[j]->signal_list[per_case_statement_idx[j]], in_index*num_statement_lists+j);
02570
02571 per_case_statement_idx[j]++;
02572 i_skip ++;
02573 }
02574 else
02575 {
02576
02577
02578
02579 if (type_of_circuit == SEQUENTIAL)
02580 {
02581
02582 signal_list_t *this_pin_list = create_pins(NULL, combined_lists->signal_list[i]->name, instance_name_prefix);
02583 oassert(this_pin_list->signal_list_size == 1);
02584 add_a_input_pin_to_node_spot_idx(mux_node, this_pin_list->signal_list[0], in_index*num_statement_lists+j);
02585
02586
02587 clean_signal_list_structure(this_pin_list);
02588 }
02589 else if (type_of_circuit == COMBINATIONAL)
02590 {
02591
02592 add_a_input_pin_to_node_spot_idx(mux_node, get_a_zero_pin(verilog_netlist), in_index*num_statement_lists+j);
02593 }
02594 else
02595 oassert(FALSE);
02596 }
02597 }
02598
02599 i += i_skip - 1;
02600 in_index++;
02601 out_index++;
02602 }
02603
02604
02605 for (i = 0; i < num_statement_lists; i++)
02606 {
02607 clean_signal_list_structure(statement_lists[i]);
02608 }
02609 clean_signal_list_structure(combined_lists);
02610
02611 return return_list;
02612 }
02613
02614
02615
02616
02617 signal_list_t *create_mux_expressions(signal_list_t **expression_lists, nnode_t *mux_node, int num_expression_lists, char *instance_name_prefix)
02618 {
02619 int i, j;
02620 signal_list_t *return_list = init_signal_list_structure();
02621 int max_index = -1;
02622
02623
02624 for (i = 0; i < num_expression_lists; i++)
02625 {
02626 if (max_index < expression_lists[i]->signal_list_size)
02627 {
02628 max_index = expression_lists[i]->signal_list_size;
02629 }
02630 }
02631
02632 for (i = 0; i < max_index; i++)
02633 {
02634 npin_t *new_pin1;
02635 npin_t *new_pin2;
02636 nnet_t *new_net;
02637 new_pin1 = allocate_npin();
02638 new_pin2 = allocate_npin();
02639 new_net = allocate_nnet();
02640
02641
02642 allocate_more_node_input_pins(mux_node, num_expression_lists);
02643
02644 add_input_port_information(mux_node, num_expression_lists);
02645
02646
02647 allocate_more_node_output_pins(mux_node, 1);
02648 add_a_output_pin_to_node_spot_idx(mux_node, new_pin1, i);
02649
02650 add_a_driver_pin_to_net(new_net, new_pin1);
02651
02652 add_a_fanout_pin_to_net(new_net, new_pin2);
02653
02654 new_pin2->name = NULL;
02655
02656 add_pin_to_signal_list(return_list, new_pin2);
02657
02658
02659 for (j = 0; j < num_expression_lists; j++)
02660 {
02661
02662 if (i < expression_lists[j]->signal_list_size)
02663 {
02664
02665 add_a_input_pin_to_node_spot_idx(mux_node, expression_lists[j]->signal_list[i], (i+1)*num_expression_lists+j);
02666
02667 }
02668 else
02669 {
02670
02671
02672
02673
02674 add_a_input_pin_to_node_spot_idx(mux_node, get_a_zero_pin(verilog_netlist), (i+1)*num_expression_lists+j);
02675 }
02676 }
02677 }
02678
02679
02680 for (i = 0; i < num_expression_lists; i++)
02681 {
02682 clean_signal_list_structure(expression_lists[i]);
02683 }
02684
02685 return return_list;
02686 }
02687
02688
02689
02690
02691 int find_smallest_non_numerical(ast_node_t *node, signal_list_t **input_list, int num_input_lists)
02692 {
02693 int i;
02694 int smallest;
02695 int smallest_idx;
02696 short *tested = (short*)calloc(sizeof(short), num_input_lists);
02697 short found_non_numerical = FALSE;
02698
02699 while(found_non_numerical == FALSE)
02700 {
02701 smallest_idx = -1;
02702 smallest = -1;
02703
02704
02705 for (i = 0; i < num_input_lists; i++)
02706 {
02707 if (tested[i] == 1)
02708 {
02709
02710 continue;
02711 }
02712 if ((smallest == -1) || (smallest >= input_list[i]->signal_list_size))
02713 {
02714 smallest = input_list[i]->signal_list_size;
02715 smallest_idx = i;
02716 }
02717 }
02718
02719 if (smallest_idx == -1)
02720 {
02721 error_message(NETLIST_ERROR, node->line_number, node->file_number, "all numbers in padding non numericals\n");
02722 }
02723 else
02724 {
02725
02726 tested[smallest_idx] = TRUE;
02727
02728
02729 for (i = 0; i < input_list[smallest_idx]->signal_list_size; i++)
02730 {
02731 if (input_list[smallest_idx]->signal_list[i]->name == NULL)
02732 {
02733
02734 found_non_numerical = TRUE;
02735 break;
02736 }
02737 if (!((strstr(input_list[smallest_idx]->signal_list[i]->name, "ONE_VCC_CNS") != NULL) || strstr(input_list[smallest_idx]->signal_list[i]->name, "ZERO_GND_ZERO") != NULL))
02738 {
02739
02740 found_non_numerical = TRUE;
02741 break;
02742 }
02743 }
02744 }
02745 }
02746
02747 return smallest_idx;
02748 }
02749
02750
02751
02752
02753 void pad_with_zeros(ast_node_t* node, signal_list_t *list, int pad_size, char *instance_name_prefix)
02754 {
02755 int i;
02756
02757 if (pad_size > list->signal_list_size)
02758 {
02759 for (i = list->signal_list_size; i < pad_size; i++)
02760 {
02761 warning_message(NETLIST_ERROR, node->line_number, node->file_number, "padding an input port with 0 for operation (likely compare)\n");
02762 add_pin_to_signal_list(list, get_a_zero_pin(verilog_netlist));
02763 }
02764 }
02765 else if (pad_size < list->signal_list_size)
02766 {
02767 warning_message(NETLIST_ERROR, node->line_number, node->file_number, "May be a warning: appears that there are more driver pins then nets to drive. This means that for this operation you are losing some of the most significant bits\n");
02768 }
02769 }
02770
02771 #ifdef VPR6
02772
02773
02774
02775
02776
02777 signal_list_t *create_dual_port_ram_block(ast_node_t* block, char *instance_name_prefix, t_model* hb_model)
02778 {
02779 signal_list_t **in_list, *return_list;
02780 nnode_t *block_node;
02781 ast_node_t *block_instance = block->children[1];
02782 ast_node_t *block_list = block_instance->children[1];
02783 ast_node_t *block_connect;
02784 char *ip_name;
02785 t_model_ports *hb_ports;
02786 int i, j, current_idx, current_out_idx;
02787 int out_port_size1, out_port_size2;
02788
02789 out_port_size1 = 0;
02790 out_port_size2 = 0;
02791 if ((hb_model == NULL) || (strcmp(hb_model->name, "dual_port_ram") != 0))
02792 {
02793 printf("Error in creating dual port ram\n");
02794 oassert(FALSE);
02795 }
02796
02797
02798 block->type = RAM;
02799 return_list = init_signal_list_structure();
02800 current_idx = 0;
02801 current_out_idx = 0;
02802
02803
02804 block_node = allocate_nnode();
02805
02806 block_node->related_ast_node = block;
02807 block_node->type = HARD_IP;
02808 block_node->name = hard_node_name(block_node, instance_name_prefix, block->children[0]->types.identifier, block_instance->children[0]->types.identifier);
02809
02810
02811 hb_model->used = 1;
02812
02813
02814 for (i = 0; i < block_list->num_children; i++)
02815 {
02816 block_connect = block_list->children[i];
02817 ip_name = block_connect->children[0]->types.identifier;
02818 hb_ports = hb_model->inputs;
02819 while ((hb_ports != NULL) && (strcmp(hb_ports->name, ip_name) != 0))
02820 hb_ports = hb_ports->next;
02821 if (hb_ports == NULL)
02822 {
02823 hb_ports = hb_model->outputs;
02824 while ((hb_ports != NULL) && (strcmp(hb_ports->name, ip_name) != 0))
02825 hb_ports = hb_ports->next;
02826 }
02827
02828 if (hb_ports == NULL)
02829 {
02830 printf("Non-existant port %s in hard block %s\n", ip_name, block->children[0]->types.identifier);
02831 block_connect->children[1]->hb_port = NULL;
02832 oassert(FALSE);
02833 }
02834
02835
02836 block_connect->children[1]->hb_port = (void *)hb_ports;
02837 }
02838
02839 in_list = (signal_list_t **)malloc(sizeof(signal_list_t *)*block_list->num_children);
02840 for (i = 0; i < block_list->num_children; i++)
02841 {
02842 int port_size;
02843 ast_node_t *block_port_connect;
02844
02845 in_list[i] = NULL;
02846 block_connect = block_list->children[i]->children[0];
02847 block_port_connect = block_list->children[i]->children[1];
02848 hb_ports = (t_model_ports *)block_list->children[i]->children[1]->hb_port;
02849 ip_name = block_connect->types.identifier;
02850
02851 if (hb_ports->dir == IN_PORT)
02852 {
02853 int min_size = 0;
02854
02855
02856 in_list[i] = create_pins(block_port_connect, NULL, instance_name_prefix);
02857 port_size = in_list[i]->signal_list_size;
02858 if (strcmp(hb_ports->name, "data1") == 0)
02859 out_port_size1 = port_size;
02860 if (strcmp(hb_ports->name, "data2") == 0)
02861 out_port_size2 = port_size;
02862
02863 if ((strcmp(hb_ports->name, "addr1") == 0) ||
02864 (strcmp(hb_ports->name, "addr2") == 0))
02865 if (port_size < hb_ports->size)
02866 min_size = hb_ports->size - port_size;
02867
02868 for (j = 0; j < port_size; j++)
02869 in_list[i]->signal_list[j]->mapping = ip_name;
02870
02871
02872 allocate_more_node_input_pins(block_node, port_size + min_size);
02873
02874 add_input_port_information(block_node, port_size + min_size);
02875
02876
02877 hookup_hb_input_pins_from_signal_list(block_node, current_idx, in_list[i], 0, port_size + min_size, verilog_netlist);
02878
02879
02880 for (j = port_size; j < port_size + min_size; j++)
02881 block_node->input_pins[current_idx+j]->mapping = strdup(ip_name);
02882 current_idx += port_size + min_size;
02883 }
02884 }
02885
02886 if (out_port_size2 != 0)
02887 oassert(out_port_size2 == out_port_size1);
02888
02889 for (i = 0; i < block_list->num_children; i++)
02890 {
02891 ast_node_t *block_port_connect;
02892 int out_port_size;
02893
02894 block_connect = block_list->children[i]->children[0];
02895 block_port_connect = block_list->children[i]->children[1];
02896 hb_ports = (t_model_ports *)block_list->children[i]->children[1]->hb_port;
02897 ip_name = block_connect->types.identifier;
02898 if (strcmp(hb_ports->name, "out1") == 0)
02899 out_port_size = out_port_size1;
02900 else
02901 out_port_size = out_port_size2;
02902
02903 if (hb_ports->dir != IN_PORT)
02904 {
02905 char *alias_name;
02906 t_memory_port_sizes *ps;
02907
02908 allocate_more_node_output_pins(block_node, out_port_size);
02909 add_output_port_information(block_node, out_port_size);
02910
02911 alias_name = make_full_ref_name(instance_name_prefix, block->children[0]->types.identifier, block->children[1]->children[0]->types.identifier, block_connect->types.identifier, -1);
02912 ps = (t_memory_port_sizes *)malloc(sizeof(t_memory_port_sizes));
02913 ps->size = out_port_size;
02914 ps->name = alias_name;
02915 memory_port_size_list = insert_in_vptr_list(memory_port_size_list, ps);
02916
02917
02918 for (j = 0; j < out_port_size; j++)
02919 {
02920 npin_t *new_pin1;
02921 npin_t *new_pin2;
02922 nnet_t *new_net;
02923 char *pin_name;
02924 long sc_spot;
02925
02926 if (out_port_size > 1)
02927 pin_name = make_full_ref_name(instance_name_prefix, block->children[0]->types.identifier, block->children[1]->children[0]->types.identifier, block_connect->types.identifier, j);
02928 else
02929 pin_name = make_full_ref_name(instance_name_prefix, block->children[0]->types.identifier, block->children[1]->children[0]->types.identifier, block_connect->types.identifier, -1);
02930
02931 new_pin1 = allocate_npin();
02932 new_pin1->mapping = make_signal_name(hb_ports->name, -1);
02933 new_pin1->name = pin_name;
02934 new_pin2 = allocate_npin();
02935 new_net = allocate_nnet();
02936 new_net->name = hb_ports->name;
02937
02938 add_a_output_pin_to_node_spot_idx(block_node, new_pin1, current_out_idx + j);
02939
02940 add_a_driver_pin_to_net(new_net, new_pin1);
02941
02942 add_a_fanout_pin_to_net(new_net, new_pin2);
02943
02944
02945 add_pin_to_signal_list(return_list, new_pin2);
02946
02947
02948 sc_spot = sc_add_string(input_nets_sc, pin_name);
02949 input_nets_sc->data[sc_spot] = (void*)new_net;
02950 }
02951 current_out_idx += j;
02952 }
02953 }
02954
02955 for (i = 0; i < block_list->num_children; i++)
02956 {
02957 clean_signal_list_structure(in_list[i]);
02958 }
02959
02960 dp_memory_list = insert_in_vptr_list(dp_memory_list, block_node);
02961 block_node->type = MEMORY;
02962
02963 return return_list;
02964 }
02965
02966
02967
02968
02969
02970
02971 signal_list_t *create_single_port_ram_block(ast_node_t* block, char *instance_name_prefix, t_model* hb_model)
02972 {
02973 signal_list_t **in_list, *return_list;
02974 nnode_t *block_node;
02975 ast_node_t *block_instance = block->children[1];
02976 ast_node_t *block_list = block_instance->children[1];
02977 ast_node_t *block_connect;
02978 char *ip_name;
02979 t_model_ports *hb_ports;
02980 int i, j, current_idx, current_out_idx;
02981 int out_port_size;
02982
02983 if ((hb_model == NULL) || (strcmp(hb_model->name, "single_port_ram") != 0))
02984 {
02985 printf("Error in creating single port ram\n");
02986 oassert(FALSE);
02987 }
02988
02989
02990 block->type = RAM;
02991 return_list = init_signal_list_structure();
02992 current_idx = 0;
02993 current_out_idx = 0;
02994
02995
02996 block_node = allocate_nnode();
02997
02998 block_node->related_ast_node = block;
02999 block_node->type = HARD_IP;
03000 block_node->name = hard_node_name(block_node, instance_name_prefix, block->children[0]->types.identifier, block_instance->children[0]->types.identifier);
03001
03002
03003 hb_model->used = 1;
03004
03005
03006 for (i = 0; i < block_list->num_children; i++)
03007 {
03008 block_connect = block_list->children[i];
03009 ip_name = block_connect->children[0]->types.identifier;
03010 hb_ports = hb_model->inputs;
03011 while ((hb_ports != NULL) && (strcmp(hb_ports->name, ip_name) != 0))
03012 hb_ports = hb_ports->next;
03013 if (hb_ports == NULL)
03014 {
03015 hb_ports = hb_model->outputs;
03016 while ((hb_ports != NULL) && (strcmp(hb_ports->name, ip_name) != 0))
03017 hb_ports = hb_ports->next;
03018 }
03019
03020 if (hb_ports == NULL)
03021 {
03022 printf("Non-existant port %s in hard block %s\n", ip_name, block->children[0]->types.identifier);
03023 block_connect->children[1]->hb_port = NULL;
03024 oassert(FALSE);
03025 }
03026
03027
03028 block_connect->children[1]->hb_port = (void *)hb_ports;
03029 }
03030
03031
03032 hb_ports = hb_model->inputs;
03033 i = 0;
03034 while (hb_ports != NULL)
03035 {
03036 i++;
03037 hb_ports = hb_ports->next;
03038 }
03039 hb_ports = hb_model->outputs;
03040 while (hb_ports != NULL)
03041 {
03042 i++;
03043 hb_ports = hb_ports->next;
03044 }
03045 if (i != block_list->num_children)
03046 {
03047 printf("Not all ports defined in hard block %s\n", ip_name);
03048 oassert(FALSE);
03049 }
03050
03051 in_list = (signal_list_t **)malloc(sizeof(signal_list_t *)*block_list->num_children);
03052 for (i = 0; i < block_list->num_children; i++)
03053 {
03054 int port_size;
03055 ast_node_t *block_port_connect;
03056
03057 in_list[i] = NULL;
03058 block_connect = block_list->children[i]->children[0];
03059 block_port_connect = block_list->children[i]->children[1];
03060 hb_ports = (t_model_ports *)block_list->children[i]->children[1]->hb_port;
03061 ip_name = block_connect->types.identifier;
03062
03063 if (hb_ports->dir == IN_PORT)
03064 {
03065 int min_size = 0;
03066
03067
03068 in_list[i] = create_pins(block_port_connect, NULL, instance_name_prefix);
03069 port_size = in_list[i]->signal_list_size;
03070 if (strcmp(hb_ports->name, "data") == 0)
03071 out_port_size = port_size;
03072
03073 if (strcmp(hb_ports->name, "addr") == 0)
03074 if (port_size < hb_ports->size)
03075 min_size = hb_ports->size - port_size;
03076
03077 for (j = 0; j < port_size; j++)
03078 in_list[i]->signal_list[j]->mapping = ip_name;
03079
03080
03081 allocate_more_node_input_pins(block_node, port_size + min_size);
03082
03083 add_input_port_information(block_node, port_size + min_size);
03084
03085
03086 hookup_hb_input_pins_from_signal_list(block_node, current_idx, in_list[i], 0, port_size + min_size, verilog_netlist);
03087
03088
03089 for (j = port_size; j < port_size + min_size; j++)
03090 block_node->input_pins[current_idx+j]->mapping = strdup(ip_name);
03091 current_idx += port_size + min_size;
03092 }
03093 }
03094
03095 for (i = 0; i < block_list->num_children; i++)
03096 {
03097 ast_node_t *block_port_connect;
03098
03099 block_connect = block_list->children[i]->children[0];
03100 block_port_connect = block_list->children[i]->children[1];
03101 hb_ports = (t_model_ports *)block_list->children[i]->children[1]->hb_port;
03102 ip_name = block_connect->types.identifier;
03103
03104 if (hb_ports->dir != IN_PORT)
03105 {
03106 char *alias_name;
03107 t_memory_port_sizes *ps;
03108
03109 allocate_more_node_output_pins(block_node, out_port_size);
03110 add_output_port_information(block_node, out_port_size);
03111
03112 alias_name = make_full_ref_name(instance_name_prefix, block->children[0]->types.identifier, block->children[1]->children[0]->types.identifier, block_connect->types.identifier, -1);
03113 ps = (t_memory_port_sizes *)malloc(sizeof(t_memory_port_sizes));
03114 ps->size = out_port_size;
03115 ps->name = alias_name;
03116 memory_port_size_list = insert_in_vptr_list(memory_port_size_list, ps);
03117
03118
03119 for (j = 0; j < out_port_size; j++)
03120 {
03121 npin_t *new_pin1;
03122 npin_t *new_pin2;
03123 nnet_t *new_net;
03124 char *pin_name;
03125 long sc_spot;
03126
03127 if (out_port_size > 1)
03128 pin_name = make_full_ref_name(instance_name_prefix, block->children[0]->types.identifier, block->children[1]->children[0]->types.identifier, block_connect->types.identifier, j);
03129 else
03130 pin_name = make_full_ref_name(instance_name_prefix, block->children[0]->types.identifier, block->children[1]->children[0]->types.identifier, block_connect->types.identifier, -1);
03131
03132 new_pin1 = allocate_npin();
03133 new_pin1->mapping = make_signal_name(hb_ports->name, -1);
03134 new_pin1->name = pin_name;
03135 new_pin2 = allocate_npin();
03136 new_net = allocate_nnet();
03137 new_net->name = hb_ports->name;
03138
03139 add_a_output_pin_to_node_spot_idx(block_node, new_pin1, current_out_idx + j);
03140
03141 add_a_driver_pin_to_net(new_net, new_pin1);
03142
03143 add_a_fanout_pin_to_net(new_net, new_pin2);
03144
03145
03146 add_pin_to_signal_list(return_list, new_pin2);
03147
03148
03149 sc_spot = sc_add_string(input_nets_sc, pin_name);
03150 input_nets_sc->data[sc_spot] = (void*)new_net;
03151 }
03152 current_out_idx += j;
03153 }
03154 }
03155
03156 for (i = 0; i < block_list->num_children; i++)
03157 {
03158 clean_signal_list_structure(in_list[i]);
03159 }
03160
03161 sp_memory_list = insert_in_vptr_list(sp_memory_list, block_node);
03162 block_node->type = MEMORY;
03163 block->net_node = block_node;
03164
03165 return return_list;
03166 }
03167
03168
03169
03170
03171
03172
03173 signal_list_t *create_hard_block(ast_node_t* block, char *instance_name_prefix)
03174 {
03175 signal_list_t **in_list, *return_list;
03176 nnode_t *block_node;
03177 ast_node_t *block_instance = block->children[1];
03178 ast_node_t *block_list = block_instance->children[1];
03179 ast_node_t *block_connect;
03180 t_model *hb_model = NULL;
03181 char *ip_name;
03182 t_model_ports *hb_ports;
03183 int i, j, current_idx, current_out_idx;
03184 int is_mult = 0;
03185 int mult_size = 0;
03186
03187
03188 hb_model = find_hard_block(block->children[0]->types.identifier);
03189 if (hb_model == NULL)
03190 {
03191 printf("Found Hard Block %s: Not supported by FPGA Architecture\n", block->children[0]->types.identifier);
03192 oassert(FALSE);
03193 }
03194
03195
03196 if (strcmp(hb_model->name, "single_port_ram") == 0)
03197 {
03198 return create_single_port_ram_block(block, instance_name_prefix, hb_model);
03199 }
03200
03201
03202 if (strcmp(hb_model->name, "dual_port_ram") == 0)
03203 {
03204 return create_dual_port_ram_block(block, instance_name_prefix, hb_model);
03205 }
03206
03207
03208 if (strcmp(hb_model->name, "multiply") == 0)
03209 {
03210 is_mult = 1;
03211 }
03212
03213 return_list = init_signal_list_structure();
03214 current_idx = 0;
03215 current_out_idx = 0;
03216
03217
03218 block_node = allocate_nnode();
03219
03220 block_node->related_ast_node = block;
03221 block_node->type = HARD_IP;
03222 block_node->name = hard_node_name(block_node, instance_name_prefix, block->children[0]->types.identifier, block_instance->children[0]->types.identifier);
03223
03224
03225 hb_model->used = 1;
03226
03227
03228 for (i = 0; i < block_list->num_children; i++)
03229 {
03230 block_connect = block_list->children[i];
03231 ip_name = block_connect->children[0]->types.identifier;
03232 hb_ports = hb_model->inputs;
03233 while ((hb_ports != NULL) && (strcmp(hb_ports->name, ip_name) != 0))
03234 hb_ports = hb_ports->next;
03235 if (hb_ports == NULL)
03236 {
03237 hb_ports = hb_model->outputs;
03238 while ((hb_ports != NULL) && (strcmp(hb_ports->name, ip_name) != 0))
03239 hb_ports = hb_ports->next;
03240 }
03241
03242 if (hb_ports == NULL)
03243 {
03244 printf("Non-existant port %s in hard block %s\n", ip_name, block->children[0]->types.identifier);
03245 block_connect->children[1]->hb_port = NULL;
03246 oassert(FALSE);
03247 }
03248
03249
03250 block_connect->children[1]->hb_port = (void *)hb_ports;
03251 }
03252
03253 in_list = (signal_list_t **)malloc(sizeof(signal_list_t *)*block_list->num_children);
03254 for (i = 0; i < block_list->num_children; i++)
03255 {
03256 int port_size;
03257 ast_node_t *block_port_connect;
03258
03259 in_list[i] = NULL;
03260 block_connect = block_list->children[i]->children[0];
03261 block_port_connect = block_list->children[i]->children[1];
03262 hb_ports = (t_model_ports *)block_list->children[i]->children[1]->hb_port;
03263 ip_name = block_connect->types.identifier;
03264
03265 if (hb_ports->dir == IN_PORT)
03266 {
03267 int min_size;
03268
03269
03270 in_list[i] = create_pins(block_port_connect, NULL, instance_name_prefix);
03271
03272
03273 port_size = hb_ports->size;
03274 if (in_list[i]->signal_list_size < port_size)
03275 min_size = in_list[i]->signal_list_size;
03276 else
03277 min_size = port_size;
03278
03279
03280 if (is_mult == 1)
03281 {
03282 min_size = in_list[i]->signal_list_size;
03283 port_size = in_list[i]->signal_list_size;
03284 mult_size = mult_size + min_size;
03285 }
03286
03287 for (j = 0; j < min_size; j++)
03288 in_list[i]->signal_list[j]->mapping = ip_name;
03289
03290
03291 allocate_more_node_input_pins(block_node, port_size);
03292
03293 add_input_port_information(block_node, port_size);
03294
03295
03296 hookup_hb_input_pins_from_signal_list(block_node, current_idx, in_list[i], 0, port_size, verilog_netlist);
03297
03298
03299 for (j = min_size; j < port_size; j++)
03300 block_node->input_pins[current_idx+j]->mapping = strdup(ip_name);
03301 current_idx += port_size;
03302 }
03303 else
03304 {
03305
03306
03307 if (is_mult == 0)
03308 {
03309 allocate_more_node_output_pins(block_node, hb_ports->size);
03310 add_output_port_information(block_node, hb_ports->size);
03311
03312
03313 for (j = 0; j < hb_ports->size; j++)
03314 {
03315 npin_t *new_pin1;
03316 npin_t *new_pin2;
03317 nnet_t *new_net;
03318 char *pin_name;
03319 long sc_spot;
03320
03321 if (hb_ports->size > 1)
03322 pin_name = make_full_ref_name(block_node->name, NULL, NULL, hb_ports->name, j);
03323 else
03324 pin_name = make_full_ref_name(block_node->name, NULL, NULL, hb_ports->name, -1);
03325
03326 new_pin1 = allocate_npin();
03327
03328
03329
03330 new_pin1->mapping = make_signal_name(hb_ports->name, -1);
03331 new_pin1->name = pin_name;
03332 new_pin2 = allocate_npin();
03333 new_net = allocate_nnet();
03334 new_net->name = hb_ports->name;
03335
03336 add_a_output_pin_to_node_spot_idx(block_node, new_pin1, current_out_idx + j);
03337
03338 add_a_driver_pin_to_net(new_net, new_pin1);
03339
03340 add_a_fanout_pin_to_net(new_net, new_pin2);
03341
03342
03343 add_pin_to_signal_list(return_list, new_pin2);
03344
03345
03346 sc_spot = sc_add_string(input_nets_sc, pin_name);
03347 input_nets_sc->data[sc_spot] = (void*)new_net;
03348 }
03349 current_out_idx += j;
03350 }
03351 }
03352 }
03353
03354
03355
03356 if (is_mult == 1)
03357 {
03358 allocate_more_node_output_pins(block_node, mult_size);
03359 add_output_port_information(block_node, mult_size);
03360
03361
03362 for (j = 0; j < mult_size; j++)
03363 {
03364 npin_t *new_pin1;
03365 npin_t *new_pin2;
03366 nnet_t *new_net;
03367 char *pin_name;
03368 long sc_spot;
03369
03370 if (hb_ports->size > 1)
03371 pin_name = make_full_ref_name(block_node->name, NULL, NULL, hb_ports->name, j);
03372 else
03373 pin_name = make_full_ref_name(block_node->name, NULL, NULL, hb_ports->name, -1);
03374
03375 new_pin1 = allocate_npin();
03376 if (hb_ports->size > 1)
03377 new_pin1->mapping = make_signal_name(hb_ports->name, j);
03378 else
03379 new_pin1->mapping = make_signal_name(hb_ports->name, -1);
03380 new_pin2 = allocate_npin();
03381 new_net = allocate_nnet();
03382 new_net->name = hb_ports->name;
03383
03384 add_a_output_pin_to_node_spot_idx(block_node, new_pin1, current_out_idx + j);
03385
03386 add_a_driver_pin_to_net(new_net, new_pin1);
03387
03388 add_a_fanout_pin_to_net(new_net, new_pin2);
03389
03390
03391 add_pin_to_signal_list(return_list, new_pin2);
03392
03393
03394 sc_spot = sc_add_string(input_nets_sc, pin_name);
03395 input_nets_sc->data[sc_spot] = (void*)new_net;
03396 }
03397 current_out_idx += j;
03398 }
03399
03400 for (i = 0; i < block_list->num_children; i++)
03401 {
03402 clean_signal_list_structure(in_list[i]);
03403 }
03404
03405
03406 if (is_mult == 1)
03407 mult_list = insert_in_vptr_list(mult_list, block_node);
03408
03409 return return_list;
03410 }
03411 #endif