00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <string.h>
00024 #include <stdio.h>
00025 #include <stdlib.h>
00026 #include <stdarg.h>
00027 #include "types.h"
00028 #include "globals.h"
00029 #include "errors.h"
00030 #include "netlist_utils.h"
00031 #include "node_creation_library.h"
00032 #include "odin_util.h"
00033 #include "outputs.h"
00034 #include "partial_map.h"
00035 #include "multipliers.h"
00036 #include "util.h"
00037 #include "hard_blocks.h"
00038
00039 void depth_first_traversal_to_partial_map(short marker_value, netlist_t *netlist);
00040 void depth_first_traverse_parital_map(nnode_t *node, int traverse_mark_number, netlist_t *netlist);
00041
00042 void partial_map_node(nnode_t *node, short traverse_number, netlist_t *netlist);
00043
00044 void instantiate_not_logic(nnode_t *node, short mark, netlist_t *netlist);
00045 void instantiate_buffer(nnode_t *node, short mark, netlist_t *netlist);
00046 void instantiate_bitwise_logic(nnode_t *node, operation_list op, short mark, netlist_t *netlist);
00047 void instantiate_bitwise_reduction(nnode_t *node, operation_list op, short mark, netlist_t *netlist);
00048 void instantiate_logical_logic(nnode_t *node, operation_list op, short mark, netlist_t *netlist);
00049 void instantiate_EQUAL(nnode_t *node, short type, short mark, netlist_t *netlist);
00050 void instantiate_GE(nnode_t *node, short type, short mark, netlist_t *netlist);
00051 void instantiate_GT(nnode_t *node, short type, short mark, netlist_t *netlist);
00052 void instantiate_shift_left_or_right(nnode_t *node, short type, short mark, netlist_t *netlist);
00053 void instantiate_multi_port_mux(nnode_t *node, short mark, netlist_t *netlist);
00054 void instantiate_add_w_carry(nnode_t *node, short mark, netlist_t *netlist);
00055 void instantiate_unary_sub(nnode_t *node, short mark, netlist_t *netlist);
00056 void instantiate_sub_w_carry(nnode_t *node, short mark, netlist_t *netlist);
00057
00058
00059
00060
00061 void partial_map_top(netlist_t *netlist)
00062 {
00063
00064 if (strcmp(configuration.output_type, "blif") == 0)
00065 {
00066
00067 depth_first_traversal_to_partial_map(PARTIAL_MAP_TRAVERSE_VALUE, netlist);
00068 }
00069 }
00070
00071
00072
00073
00074 void depth_first_traversal_to_partial_map(short marker_value, netlist_t *netlist)
00075 {
00076 int i;
00077
00078
00079 for (i = 0; i < netlist->num_top_input_nodes; i++)
00080 {
00081 if (netlist->top_input_nodes[i] != NULL)
00082 {
00083 depth_first_traverse_parital_map(netlist->top_input_nodes[i], marker_value, netlist);
00084 }
00085 }
00086
00087 depth_first_traverse_parital_map(netlist->gnd_node, marker_value, netlist);
00088 depth_first_traverse_parital_map(netlist->vcc_node, marker_value, netlist);
00089 }
00090
00091
00092
00093
00094 void depth_first_traverse_parital_map(nnode_t *node, int traverse_mark_number, netlist_t *netlist)
00095 {
00096 int i, j;
00097 nnode_t *next_node;
00098 nnet_t *next_net;
00099
00100 if (node->traverse_visited == traverse_mark_number)
00101 {
00102 return;
00103 }
00104 else
00105 {
00106
00107
00108
00109 node->traverse_visited = traverse_mark_number;
00110
00111 for (i = 0; i < node->num_output_pins; i++)
00112 {
00113 if (node->output_pins[i]->net == NULL)
00114 continue;
00115
00116 next_net = node->output_pins[i]->net;
00117 for (j = 0; j < next_net->num_fanout_pins; j++)
00118 {
00119 if (next_net->fanout_pins[j] == NULL)
00120 continue;
00121
00122 next_node = next_net->fanout_pins[j]->node;
00123 if (next_node == NULL)
00124 continue;
00125
00126
00127 depth_first_traverse_parital_map(next_node, traverse_mark_number, netlist);
00128 }
00129 }
00130
00131
00132 partial_map_node(node, traverse_mark_number, netlist);
00133 }
00134 }
00135
00136
00137
00138
00139 void partial_map_node(nnode_t *node, short traverse_number, netlist_t *netlist)
00140 {
00141 switch (node->type)
00142 {
00143 case BITWISE_NOT:
00144 instantiate_not_logic(node, traverse_number, netlist);
00145 break;
00146 case BUF_NODE:
00147 instantiate_buffer(node, traverse_number, netlist);
00148 break;
00149
00150 case BITWISE_AND:
00151 case BITWISE_OR:
00152 case BITWISE_NAND:
00153 case BITWISE_NOR:
00154 case BITWISE_XNOR:
00155 case BITWISE_XOR:
00156 if (node->num_input_port_sizes == 2)
00157 {
00158 instantiate_bitwise_logic(node, node->type, traverse_number, netlist);
00159 }
00160 else if (node->num_input_port_sizes == 1)
00161 {
00162 instantiate_bitwise_reduction(node, node->type, traverse_number, netlist);
00163 }
00164 else
00165 oassert(FALSE);
00166 break;
00167
00168 case LOGICAL_OR:
00169 case LOGICAL_AND:
00170 case LOGICAL_NOR:
00171 case LOGICAL_NAND:
00172 case LOGICAL_XOR:
00173 case LOGICAL_XNOR:
00174 if (node->num_input_port_sizes == 2)
00175 {
00176 instantiate_logical_logic(node, node->type, traverse_number, netlist);
00177 }
00178 break;
00179
00180 case LOGICAL_NOT:
00181
00182 break;
00183
00184 case ADD:
00185 instantiate_add_w_carry(node, traverse_number, netlist);
00186 break;
00187 case MINUS:
00188 if (node->num_input_port_sizes == 2)
00189 {
00190 instantiate_sub_w_carry(node, traverse_number, netlist);
00191 }
00192 else if (node->num_input_port_sizes == 1)
00193 {
00194 instantiate_unary_sub(node, traverse_number, netlist);
00195 }
00196 else
00197 oassert(FALSE);
00198 break;
00199 case LOGICAL_EQUAL:
00200 case NOT_EQUAL:
00201 instantiate_EQUAL(node, node->type, traverse_number, netlist);
00202 break;
00203 case GTE:
00204 case LTE:
00205 instantiate_GE(node, node->type, traverse_number, netlist);
00206 break;
00207 case GT:
00208 case LT:
00209 instantiate_GT(node, node->type, traverse_number, netlist);
00210 break;
00211 case SL:
00212 case SR:
00213 instantiate_shift_left_or_right(node, node->type, traverse_number, netlist);
00214 break;
00215 case MULTI_PORT_MUX:
00216 instantiate_multi_port_mux(node, traverse_number, netlist);
00217 break;
00218 case MULTIPLY:
00219 if (hard_multipliers != NULL)
00220 {
00221 #ifdef VPR6
00222 if ((node->input_port_sizes[0] * node->input_port_sizes[1]) > min_mult)
00223 instantiate_hard_multiplier(node, traverse_number, netlist);
00224 #endif
00225 }
00226 else
00227 instantiate_simple_soft_multiplier(node, traverse_number, netlist);
00228 break;
00229
00230 case MEMORY:
00231 case HARD_IP:
00232 #ifdef VPR6
00233 instantiate_hard_block(node, traverse_number, netlist);
00234 #endif
00235 break;
00236
00237 case ADDER_FUNC:
00238 case CARRY_FUNC:
00239 case MUX_2:
00240 case INPUT_NODE:
00241 case CLOCK_NODE:
00242 case OUTPUT_NODE:
00243 case GND_NODE:
00244 case VCC_NODE:
00245 case FF_NODE:
00246
00247 break;
00248
00249 case CASE_EQUAL:
00250 case CASE_NOT_EQUAL:
00251 case DIVIDE:
00252 case MODULO:
00253 default:
00254 oassert(FALSE);
00255 break;
00256 }
00257 }
00258
00259
00260
00261
00262
00263 void instantiate_multi_port_mux(nnode_t *node, short mark, netlist_t *netlist)
00264 {
00265 int i, j;
00266 int width_of_one_hot_logic;
00267 int num_ports;
00268 int port_offset;
00269 nnode_t **muxes;
00270
00271
00272 width_of_one_hot_logic = node->input_port_sizes[0];
00273 num_ports = node->num_input_port_sizes;
00274 port_offset = node->input_port_sizes[1];
00275
00276 muxes = (nnode_t**)malloc(sizeof(nnode_t*)*(num_ports-1));
00277 for(i = 0; i < num_ports-1; i++)
00278 {
00279 muxes[i] = make_2port_gate(MUX_2, width_of_one_hot_logic, width_of_one_hot_logic, 1, node, mark);
00280 }
00281
00282 for(j = 0; j < num_ports - 1; j++)
00283 {
00284 if (j == 0)
00285 {
00286 for(i = 0; i < width_of_one_hot_logic; i++)
00287 {
00288
00289 remap_pin_to_new_node(node->input_pins[i+(j+1)*port_offset], muxes[j], width_of_one_hot_logic+i);
00290
00291 remap_pin_to_new_node(node->input_pins[i], muxes[j], i);
00292 }
00293 }
00294 else
00295 {
00296 for(i = 0; i < width_of_one_hot_logic; i++)
00297 {
00298
00299 remap_pin_to_new_node(node->input_pins[i+(j+1)*port_offset], muxes[j], width_of_one_hot_logic+i);
00300
00301 add_a_input_pin_to_node_spot_idx(muxes[j], copy_input_npin(muxes[0]->input_pins[i]), i);
00302 }
00303 }
00304
00305 remap_pin_to_new_node(node->output_pins[j], muxes[j], 0);
00306 }
00307 }
00308
00309
00310
00311
00312 void instantiate_not_logic(nnode_t *node, short mark, netlist_t *netlist)
00313 {
00314 int width = node->num_input_pins;
00315 nnode_t **new_not_cells;
00316 int i;
00317
00318 new_not_cells = (nnode_t**)malloc(sizeof(nnode_t*)*width);
00319
00320 for (i = 0; i < width; i++)
00321 {
00322 new_not_cells[i] = make_not_gate(node, mark);
00323 }
00324
00325
00326 for(i = 0; i < width; i++)
00327 {
00328
00329 remap_pin_to_new_node(node->input_pins[i], new_not_cells[i], 0);
00330 remap_pin_to_new_node(node->output_pins[i], new_not_cells[i], 0);
00331 }
00332
00333 free(new_not_cells);
00334 }
00335
00336
00337
00338
00339
00340 void instantiate_buffer(nnode_t *node, short mark, netlist_t *netlist)
00341 {
00342 int width = node->num_input_pins;
00343 int i;
00344
00345
00346 for (i = 0; i < width; i++)
00347 {
00348 int idx_2_buffer = node->input_pins[i]->pin_net_idx;
00349
00350
00351 join_nets(node->input_pins[i]->net, node->output_pins[i]->net);
00352
00353
00354 node->input_pins[i]->net->fanout_pins[idx_2_buffer] = NULL;
00355 }
00356 }
00357
00358
00359
00360
00361 void instantiate_logical_logic(nnode_t *node, operation_list op, short mark, netlist_t *netlist)
00362 {
00363 int i;
00364 int port_B_offset;
00365 int width_a;
00366 int width_b;
00367 nnode_t *new_logic_cell;
00368 nnode_t *reduction1;
00369 nnode_t *reduction2;
00370
00371 oassert(node->num_input_pins > 0);
00372 oassert(node->num_input_port_sizes == 2);
00373 oassert(node->num_output_pins == 1);
00374
00375 width_a = node->input_port_sizes[0];
00376 width_b = node->input_port_sizes[1];
00377 port_B_offset = width_a;
00378
00379
00380 new_logic_cell = make_1port_logic_gate(op, 2, node, mark);
00381 reduction1 = make_1port_logic_gate(BITWISE_OR, width_a, node, mark);
00382 reduction2 = make_1port_logic_gate(BITWISE_OR, width_b, node, mark);
00383
00384
00385 for(i = 0; i < width_a; i++)
00386 {
00387
00388 if (i < width_a)
00389 {
00390 remap_pin_to_new_node(node->input_pins[i], reduction1, i);
00391 }
00392 else
00393 {
00394
00395 add_a_input_pin_to_node_spot_idx(reduction1, get_a_zero_pin(netlist), i);
00396 }
00397 }
00398 for(i = 0; i < width_b; i++)
00399 {
00400
00401 if (i < width_b)
00402 {
00403 remap_pin_to_new_node(node->input_pins[i+port_B_offset], reduction2, i);
00404 }
00405 else
00406 {
00407
00408 add_a_input_pin_to_node_spot_idx(reduction2, get_a_zero_pin(netlist), i);
00409 }
00410 }
00411
00412 connect_nodes(reduction1, 0, new_logic_cell, 0);
00413 connect_nodes(reduction2, 0, new_logic_cell, 1);
00414
00415 instantiate_bitwise_reduction(reduction1, BITWISE_OR, mark, netlist);
00416 instantiate_bitwise_reduction(reduction2, BITWISE_OR, mark, netlist);
00417
00418 remap_pin_to_new_node(node->output_pins[0], new_logic_cell, 0);
00419 }
00420
00421
00422
00423
00424 void instantiate_bitwise_reduction(nnode_t *node, operation_list op, short mark, netlist_t *netlist)
00425 {
00426 int width;
00427 int i;
00428 int width_a;
00429 nnode_t *new_logic_cell;
00430 operation_list cell_op;
00431
00432 oassert(node->num_input_pins > 0);
00433 oassert(node->num_input_port_sizes == 1);
00434 oassert(node->output_port_sizes[0] == 1);
00435
00436 width = node->output_port_sizes[0];
00437 width_a = node->input_port_sizes[0];
00438
00439 switch (op)
00440 {
00441 case BITWISE_AND:
00442 case LOGICAL_AND:
00443 cell_op = LOGICAL_AND;
00444 break;
00445 case BITWISE_OR:
00446 case LOGICAL_OR:
00447 cell_op = LOGICAL_OR;
00448 break;
00449 case BITWISE_NAND:
00450 case LOGICAL_NAND:
00451 cell_op = LOGICAL_NAND;
00452 break;
00453 case BITWISE_NOR:
00454 case LOGICAL_NOR:
00455 cell_op = LOGICAL_NOR;
00456 break;
00457 case BITWISE_XNOR:
00458 case LOGICAL_XNOR:
00459 cell_op = LOGICAL_XNOR;
00460 break;
00461 case BITWISE_XOR:
00462 case LOGICAL_XOR:
00463 cell_op = LOGICAL_XOR;
00464 break;
00465 default:
00466 oassert(FALSE);
00467 }
00468
00469 new_logic_cell = make_1port_logic_gate(cell_op, width_a, node, mark);
00470
00471
00472 for(i = 0; i < width_a; i++)
00473 {
00474
00475 if (i < width_a)
00476 {
00477 remap_pin_to_new_node(node->input_pins[i], new_logic_cell, i);
00478 }
00479 else
00480 {
00481
00482 add_a_input_pin_to_node_spot_idx(new_logic_cell, get_a_zero_pin(netlist), i);
00483 }
00484 }
00485
00486 remap_pin_to_new_node(node->output_pins[0], new_logic_cell, 0);
00487 }
00488
00489
00490
00491
00492
00493 void instantiate_bitwise_logic(nnode_t *node, operation_list op, short mark, netlist_t *netlist)
00494 {
00495 int width;
00496 int i;
00497 int port_B_offset;
00498 int width_a;
00499 int width_b;
00500 nnode_t **new_logic_cells;
00501 operation_list cell_op;
00502
00503 oassert(node->num_input_pins > 0);
00504 oassert(node->num_input_port_sizes == 2);
00505
00506 width = node->output_port_sizes[0];
00507 width_a = node->input_port_sizes[0];
00508 width_b = node->input_port_sizes[1];
00509 port_B_offset = width_a;
00510
00511 switch (op)
00512 {
00513 case BITWISE_AND:
00514 cell_op = LOGICAL_AND;
00515 break;
00516 case BITWISE_OR:
00517 cell_op = LOGICAL_OR;
00518 break;
00519 case BITWISE_NAND:
00520 cell_op = LOGICAL_NAND;
00521 break;
00522 case BITWISE_NOR:
00523 cell_op = LOGICAL_NOR;
00524 break;
00525 case BITWISE_XNOR:
00526 cell_op = LOGICAL_XNOR;
00527 break;
00528 case BITWISE_XOR:
00529 cell_op = LOGICAL_XOR;
00530 break;
00531 default:
00532 oassert(FALSE);
00533 break;
00534 }
00535 new_logic_cells = (nnode_t**)malloc(sizeof(nnode_t*)*width);
00536 for (i = 0; i < width; i++)
00537 {
00538
00539 new_logic_cells[i] = make_2port_gate(cell_op, 1, 1, 1, node, mark);
00540 }
00541
00542
00543 for(i = 0; i < width; i++)
00544 {
00545
00546 if (i < width_a)
00547 {
00548 if (i < width_b)
00549 {
00550
00551 remap_pin_to_new_node(node->input_pins[i], new_logic_cells[i], 0);
00552 }
00553 else
00554 {
00555
00556 add_a_input_pin_to_node_spot_idx(new_logic_cells[i], get_a_zero_pin(netlist), 0);
00557 }
00558 }
00559
00560 if (i < width_b)
00561 {
00562 if (i < width_a)
00563 {
00564
00565
00566 remap_pin_to_new_node(node->input_pins[i+port_B_offset], new_logic_cells[i], 1);
00567 }
00568 else
00569 {
00570
00571 add_a_input_pin_to_node_spot_idx(new_logic_cells[i], get_a_zero_pin(netlist), 1);
00572 }
00573 }
00574
00575 remap_pin_to_new_node(node->output_pins[i], new_logic_cells[i], 0);
00576 }
00577
00578 free(new_logic_cells);
00579 }
00580
00581
00582
00583
00584
00585
00586
00587 void instantiate_add_w_carry(nnode_t *node, short mark, netlist_t *netlist)
00588 {
00589 int width;
00590 int width_a;
00591 int width_b;
00592 int i;
00593 nnode_t **new_add_cells;
00594 nnode_t **new_carry_cells;
00595
00596 oassert(node->num_input_pins > 0);
00597 oassert(node->num_input_port_sizes == 2);
00598 width = node->output_port_sizes[0];
00599 width_a = node->input_port_sizes[0];
00600 width_b = node->input_port_sizes[1];
00601
00602 new_add_cells = (nnode_t**)malloc(sizeof(nnode_t*)*width);
00603 new_carry_cells = (nnode_t**)malloc(sizeof(nnode_t*)*width);
00604
00605
00606 for (i = 0; i < width; i++)
00607 {
00608 new_add_cells[i] = make_3port_gate(ADDER_FUNC, 1, 1, 1, 1, node, mark);
00609 if (i < width - 1)
00610 {
00611 new_carry_cells[i] = make_3port_gate(CARRY_FUNC, 1, 1, 1, 1, node, mark);
00612 }
00613 }
00614
00615
00616 add_a_input_pin_to_node_spot_idx(new_add_cells[0], get_a_zero_pin(netlist), 0);
00617 if (i > 1)
00618 {
00619 add_a_input_pin_to_node_spot_idx(new_carry_cells[0], get_a_zero_pin(netlist), 0);
00620 }
00621
00622
00623 for(i = 0; i < width; i++)
00624 {
00625 if (i < width_a)
00626 {
00627
00628 remap_pin_to_new_node(node->input_pins[i], new_add_cells[i], 1);
00629 if (i < width - 1)
00630 add_a_input_pin_to_node_spot_idx(new_carry_cells[i], copy_input_npin(new_add_cells[i]->input_pins[1]), 1);
00631 }
00632 else
00633 {
00634 add_a_input_pin_to_node_spot_idx(new_add_cells[i], get_a_zero_pin(netlist), 1);
00635 if (i < width - 1)
00636 add_a_input_pin_to_node_spot_idx(new_carry_cells[i], get_a_zero_pin(netlist), 1);
00637 }
00638
00639 if (i < width_b)
00640 {
00641
00642 remap_pin_to_new_node(node->input_pins[i+width_a], new_add_cells[i], 2);
00643 if (i < width - 1)
00644 add_a_input_pin_to_node_spot_idx(new_carry_cells[i], copy_input_npin(new_add_cells[i]->input_pins[2]), 2);
00645 }
00646 else
00647 {
00648 add_a_input_pin_to_node_spot_idx(new_add_cells[i], get_a_zero_pin(netlist), 2);
00649 if (i < width - 1)
00650 add_a_input_pin_to_node_spot_idx(new_carry_cells[i], get_a_zero_pin(netlist), 2);
00651 }
00652
00653
00654 remap_pin_to_new_node(node->output_pins[i], new_add_cells[i], 0);
00655 }
00656
00657
00658 for(i = 1; i < width; i++)
00659 {
00660 connect_nodes(new_carry_cells[i-1], 0, new_add_cells[i], 0);
00661 if (i < width - 1)
00662 connect_nodes(new_carry_cells[i-1], 0, new_carry_cells[i], 0);
00663 }
00664
00665 free(new_add_cells);
00666 free(new_carry_cells);
00667 }
00668
00669
00670
00671
00672
00673
00674 void instantiate_sub_w_carry(nnode_t *node, short mark, netlist_t *netlist)
00675 {
00676 int width;
00677 int width_a;
00678 int width_b;
00679 int i;
00680 nnode_t **new_add_cells;
00681 nnode_t **new_carry_cells;
00682 nnode_t **new_not_cells;
00683
00684 oassert(node->num_input_pins > 0);
00685 oassert(node->num_input_port_sizes == 2);
00686 width = node->output_port_sizes[0];
00687 width_a = node->input_port_sizes[0];
00688 width_b = node->input_port_sizes[1];
00689
00690 new_add_cells = (nnode_t**)malloc(sizeof(nnode_t*)*width);
00691 new_carry_cells = (nnode_t**)malloc(sizeof(nnode_t*)*width);
00692 new_not_cells = (nnode_t**)malloc(sizeof(nnode_t*)*width);
00693
00694
00695 for (i = 0; i < width; i++)
00696 {
00697 new_add_cells[i] = make_3port_gate(ADDER_FUNC, 1, 1, 1, 1, node, mark);
00698 new_not_cells[i] = make_not_gate(node, mark);
00699 if (i < width - 1)
00700 {
00701 new_carry_cells[i] = make_3port_gate(CARRY_FUNC, 1, 1, 1, 1, node, mark);
00702 }
00703 }
00704
00705
00706 add_a_input_pin_to_node_spot_idx(new_add_cells[0], get_a_one_pin(netlist), 0);
00707 if (i > 1)
00708 {
00709 add_a_input_pin_to_node_spot_idx(new_carry_cells[0], get_a_one_pin(netlist), 0);
00710 }
00711
00712
00713 for(i = 0; i < width; i++)
00714 {
00715 if (i < width_a)
00716 {
00717
00718 remap_pin_to_new_node(node->input_pins[i], new_add_cells[i], 1);
00719 if (i < width - 1)
00720 add_a_input_pin_to_node_spot_idx(new_carry_cells[i], copy_input_npin(new_add_cells[i]->input_pins[1]), 1);
00721 }
00722 else
00723 {
00724 add_a_input_pin_to_node_spot_idx(new_add_cells[i], get_a_zero_pin(netlist), 1);
00725 if (i < width - 1)
00726 add_a_input_pin_to_node_spot_idx(new_carry_cells[i], get_a_zero_pin(netlist), 1);
00727 }
00728
00729 if (i < width_b)
00730 {
00731
00732 remap_pin_to_new_node(node->input_pins[i+width_a], new_not_cells[i], 0);
00733 }
00734 else
00735 {
00736 add_a_input_pin_to_node_spot_idx(new_not_cells[i], get_a_zero_pin(netlist), 0);
00737 }
00738
00739
00740 connect_nodes(new_not_cells[i], 0, new_add_cells[i], 2);
00741 if (i < width - 1)
00742 connect_nodes(new_not_cells[i], 0, new_carry_cells[i], 2);
00743
00744
00745 remap_pin_to_new_node(node->output_pins[i], new_add_cells[i], 0);
00746 }
00747
00748
00749 for(i = 1; i < width; i++)
00750 {
00751 connect_nodes(new_carry_cells[i-1], 0, new_add_cells[i], 0);
00752 if (i < width - 1)
00753 connect_nodes(new_carry_cells[i-1], 0, new_carry_cells[i], 0);
00754 }
00755
00756 free(new_add_cells);
00757 free(new_carry_cells);
00758 }
00759
00760
00761
00762
00763
00764 void instantiate_unary_sub(nnode_t *node, short mark, netlist_t *netlist)
00765 {
00766 int width;
00767 int width_a;
00768 int i;
00769 nnode_t **new_add_cells;
00770 nnode_t **new_carry_cells;
00771 nnode_t **new_not_cells;
00772
00773 oassert(node->num_input_pins > 0);
00774 oassert(node->num_input_port_sizes == 1);
00775 width = node->output_port_sizes[0];
00776 width_a = node->input_port_sizes[0];
00777
00778 new_add_cells = (nnode_t**)malloc(sizeof(nnode_t*)*width);
00779 new_carry_cells = (nnode_t**)malloc(sizeof(nnode_t*)*width);
00780 new_not_cells = (nnode_t**)malloc(sizeof(nnode_t*)*width);
00781
00782
00783 for (i = 0; i < width; i++)
00784 {
00785 new_add_cells[i] = make_3port_gate(ADDER_FUNC, 1, 1, 1, 1, node, mark);
00786 new_not_cells[i] = make_not_gate(node, mark);
00787 if (i < width - 1)
00788 {
00789 new_carry_cells[i] = make_3port_gate(CARRY_FUNC, 1, 1, 1, 1, node, mark);
00790 }
00791 }
00792
00793
00794 add_a_input_pin_to_node_spot_idx(new_add_cells[0], get_a_one_pin(netlist), 0);
00795 if (i > 1)
00796 {
00797 add_a_input_pin_to_node_spot_idx(new_carry_cells[0], get_a_one_pin(netlist), 0);
00798 }
00799
00800
00801 for(i = 0; i < width; i++)
00802 {
00803
00804 remap_pin_to_new_node(node->input_pins[i], new_not_cells[i], 0);
00805 connect_nodes(new_not_cells[i], 0, new_add_cells[i], 1);
00806 if (i < width - 1)
00807 connect_nodes(new_not_cells[i], 0, new_carry_cells[i], 1);
00808
00809 add_a_input_pin_to_node_spot_idx(new_add_cells[i], get_a_zero_pin(netlist), 2);
00810 if (i < width - 1)
00811 add_a_input_pin_to_node_spot_idx(new_carry_cells[i], get_a_zero_pin(netlist), 2);
00812
00813
00814 remap_pin_to_new_node(node->output_pins[i], new_add_cells[i], 0);
00815 }
00816
00817
00818 for(i = 1; i < width; i++)
00819 {
00820 connect_nodes(new_carry_cells[i-1], 0, new_add_cells[i], 0);
00821 if (i < width - 1)
00822 connect_nodes(new_carry_cells[i-1], 0, new_carry_cells[i], 0);
00823 }
00824
00825 free(new_add_cells);
00826 free(new_carry_cells);
00827 }
00828
00829
00830
00831
00832
00833
00834 void instantiate_EQUAL(nnode_t *node, short type, short mark, netlist_t *netlist)
00835 {
00836 int width_a;
00837 int width_b;
00838 int width_max;
00839 int i;
00840 int port_B_offset;
00841 nnode_t *xnor_gate;
00842 nnode_t *logical_and_gate;
00843
00844 oassert(node->num_output_pins == 1);
00845 oassert(node->num_input_pins > 0);
00846 oassert(node->num_input_port_sizes == 2);
00847 width_a = node->input_port_sizes[0];
00848 width_b = node->input_port_sizes[1];
00849 width_max = width_a > width_b ? width_a : width_b;
00850 port_B_offset = width_a;
00851
00852
00853 xnor_gate = make_2port_gate(LOGICAL_XNOR, width_a, width_b, width_max, node, mark);
00854
00855 logical_and_gate = make_1port_logic_gate(LOGICAL_AND, width_max, node, mark);
00856
00857
00858 for(i = 0; i < width_max; i++)
00859 {
00860
00861 if (i < width_a)
00862 {
00863 if (i < width_b)
00864 {
00865
00866 remap_pin_to_new_node(node->input_pins[i], xnor_gate, i);
00867 }
00868 else
00869 {
00870
00871 add_a_input_pin_to_node_spot_idx(xnor_gate, get_a_zero_pin(netlist), i);
00872 }
00873 }
00874
00875 if (i < width_b)
00876 {
00877 if (i < width_a)
00878 {
00879
00880
00881 remap_pin_to_new_node(node->input_pins[i+port_B_offset], xnor_gate, i+port_B_offset);
00882 }
00883 else
00884 {
00885
00886 add_a_input_pin_to_node_spot_idx(xnor_gate, get_a_zero_pin(netlist), i+port_B_offset);
00887 }
00888 }
00889
00890
00891 connect_nodes(xnor_gate, i, logical_and_gate, i);
00892 }
00893
00894
00895 remap_pin_to_new_node(node->output_pins[0], logical_and_gate, 0);
00896
00897 if (type == LOGICAL_EQUAL)
00898 instantiate_bitwise_logic(xnor_gate, BITWISE_XNOR, mark, netlist);
00899 else if (type == NOT_EQUAL)
00900 instantiate_bitwise_logic(xnor_gate, BITWISE_XOR, mark, netlist);
00901
00902
00903 oassert(logical_and_gate->num_output_pins == 1);
00904 }
00905
00906
00907
00908
00909
00910
00911 void instantiate_GT(nnode_t *node, short type, short mark, netlist_t *netlist)
00912 {
00913 int width_a;
00914 int width_b;
00915 int width_max;
00916 int i;
00917 int port_A_offset;
00918 int port_B_offset;
00919 int port_A_index;
00920 int port_B_index;
00921 int index = 0;
00922 nnode_t *xor_gate;
00923 nnode_t *logical_or_gate;
00924 nnode_t **or_cells;
00925 nnode_t **gt_cells;
00926
00927 oassert(node->num_output_pins == 1);
00928 oassert(node->num_input_pins > 0);
00929 oassert(node->num_input_port_sizes == 2);
00930 oassert(node->input_port_sizes[0] == node->input_port_sizes[1]);
00931 width_a = node->input_port_sizes[0];
00932 width_b = node->input_port_sizes[1];
00933 width_max = width_a > width_b ? width_a : width_b;
00934
00935
00936 if (type == GT)
00937 {
00938 port_A_offset = 0;
00939 port_B_offset = width_a;
00940 port_A_index = 0;
00941 port_B_index = width_a-1;
00942 }
00943 else if (type == LT)
00944 {
00945 port_A_offset = width_b;
00946 port_B_offset = 0;
00947 port_A_index = width_b-1;
00948 port_B_index = 0;
00949 }
00950
00951
00952 xor_gate = make_2port_gate(LOGICAL_XOR, width_a-1, width_b-1, width_max-1, node, mark);
00953
00954 logical_or_gate = make_1port_logic_gate(LOGICAL_OR, width_max, node, mark);
00955
00956 or_cells = (nnode_t**)malloc(sizeof(nnode_t*)*width_max-1);
00957
00958 gt_cells = (nnode_t**)malloc(sizeof(nnode_t*)*width_max);
00959
00960 for (i = 0; i < width_max; i++)
00961 {
00962 gt_cells[i] = make_3port_gate(GT, 1, 1, 1, 1, node, mark);
00963 if (i < width_max-1)
00964 {
00965 or_cells[i] = make_2port_gate(LOGICAL_OR, 1, 1, 1, node, mark);
00966 }
00967 }
00968
00969
00970 for(i = 0; i < width_max; i++)
00971 {
00972
00973 if (i < width_a)
00974 {
00975
00976 remap_pin_to_new_node(node->input_pins[i+port_A_offset], gt_cells[i], 0);
00977 if (i > 0)
00978 add_a_input_pin_to_node_spot_idx(xor_gate, copy_input_npin(gt_cells[i]->input_pins[0]), index+port_A_index);
00979 }
00980 else
00981 {
00982
00983 add_a_input_pin_to_node_spot_idx(gt_cells[i], get_a_zero_pin(netlist), 0);
00984 if (i > 0)
00985 add_a_input_pin_to_node_spot_idx(xor_gate, get_a_zero_pin(netlist), index+port_A_index);
00986 }
00987
00988 if (i < width_b)
00989 {
00990
00991
00992 remap_pin_to_new_node(node->input_pins[i+port_B_offset], gt_cells[i], 1);
00993 if (i > 0)
00994 add_a_input_pin_to_node_spot_idx(xor_gate, copy_input_npin(gt_cells[i]->input_pins[1]), index+port_B_index);
00995 }
00996 else
00997 {
00998
00999 add_a_input_pin_to_node_spot_idx(gt_cells[i], get_a_zero_pin(netlist), 1);
01000 if (i > 0)
01001 add_a_input_pin_to_node_spot_idx(xor_gate, get_a_zero_pin(netlist), index+port_B_index);
01002 }
01003
01004 if (i < width_max-1)
01005 {
01006
01007 if (i < width_max-2)
01008 {
01009
01010 connect_nodes(or_cells[i+1], 0, or_cells[i], 1);
01011 }
01012 else
01013 {
01014
01015 add_a_input_pin_to_node_spot_idx(or_cells[i], get_a_zero_pin(netlist), 1);
01016 }
01017
01018
01019 connect_nodes(xor_gate, i, or_cells[i], 0);
01020 connect_nodes(or_cells[i], 0, gt_cells[i], 2);
01021
01022 }
01023 else
01024 {
01025
01026 add_a_input_pin_to_node_spot_idx(gt_cells[i], get_a_zero_pin(netlist), 2);
01027 }
01028
01029
01030 connect_nodes(gt_cells[i], 0, logical_or_gate, i);
01031
01032 if (i > 0)
01033 {
01034 index++;
01035 }
01036 }
01037
01038
01039 remap_pin_to_new_node(node->output_pins[0], logical_or_gate, 0);
01040 oassert(logical_or_gate->num_output_pins == 1);
01041
01042 instantiate_bitwise_logic(xor_gate, BITWISE_XOR, mark, netlist);
01043 }
01044
01045
01046
01047
01048
01049
01050 void instantiate_GE(nnode_t *node, short type, short mark, netlist_t *netlist)
01051 {
01052 int width_a;
01053 int width_b;
01054 int width_max;
01055 int i;
01056 int port_B_offset;
01057 int port_A_offset;
01058 nnode_t *equal;
01059 nnode_t *gt;
01060 nnode_t *logical_or_final_gate;
01061
01062 oassert(node->num_output_pins == 1);
01063 oassert(node->num_input_pins > 0);
01064 oassert(node->num_input_port_sizes == 2);
01065 oassert(node->input_port_sizes[0] == node->input_port_sizes[1]);
01066 width_a = node->input_port_sizes[0];
01067 width_b = node->input_port_sizes[1];
01068 oassert(width_a == width_b);
01069 width_max = width_a > width_b ? width_a : width_b;
01070
01071
01072 if (type == GTE)
01073 {
01074 port_A_offset = 0;
01075 port_B_offset = width_a;
01076 }
01077 else if (type == LTE)
01078 {
01079 port_A_offset = width_b;
01080 port_B_offset = 0;
01081 }
01082
01083
01084 equal = make_2port_gate(LOGICAL_EQUAL, width_a, width_b, 1, node, mark);
01085 gt = make_2port_gate(GT, width_a, width_b, 1, node, mark);
01086 logical_or_final_gate = make_1port_logic_gate(LOGICAL_OR, 2, node, mark);
01087
01088
01089 for(i = 0; i < width_max; i++)
01090 {
01091
01092 if (i < width_a)
01093 {
01094
01095 remap_pin_to_new_node(node->input_pins[i+port_A_offset], equal, i+port_A_offset);
01096 add_a_input_pin_to_node_spot_idx(gt, copy_input_npin(equal->input_pins[i+port_A_offset]), i+port_A_offset);
01097 }
01098 else
01099 {
01100
01101 add_a_input_pin_to_node_spot_idx(equal, get_a_zero_pin(netlist), i+port_A_offset);
01102 add_a_input_pin_to_node_spot_idx(gt, get_a_zero_pin(netlist), i+port_A_offset);
01103 }
01104
01105 if (i < width_b)
01106 {
01107
01108
01109 remap_pin_to_new_node(node->input_pins[i+port_B_offset], equal, i+port_B_offset);
01110 add_a_input_pin_to_node_spot_idx(gt, copy_input_npin(equal->input_pins[i+port_B_offset]), i+port_B_offset);
01111 }
01112 else
01113 {
01114
01115 add_a_input_pin_to_node_spot_idx(equal, get_a_zero_pin(netlist), i+port_B_offset);
01116 add_a_input_pin_to_node_spot_idx(gt, get_a_zero_pin(netlist), i+port_B_offset);
01117 }
01118 }
01119 connect_nodes(equal, 0, logical_or_final_gate, 0);
01120 connect_nodes(gt, 0, logical_or_final_gate, 1);
01121
01122
01123 remap_pin_to_new_node(node->output_pins[0], logical_or_final_gate, 0);
01124 oassert(logical_or_final_gate->num_output_pins == 1);
01125
01126
01127 instantiate_EQUAL(equal, LOGICAL_EQUAL, mark, netlist);
01128 instantiate_GT(gt, GT, mark, netlist);
01129 }
01130
01131
01132
01133
01134
01135 void instantiate_shift_left_or_right(nnode_t *node, short type, short mark, netlist_t *netlist)
01136 {
01137
01138 int width;
01139 int i;
01140 int shift_size;
01141 nnode_t *buf_node;
01142
01143 width = node->input_port_sizes[0];
01144
01145 if (node->related_ast_node->children[1]->type == NUMBERS)
01146 {
01147
01148 shift_size = node->related_ast_node->children[1]->types.number.value;
01149 }
01150 else
01151 {
01152 error_message(NETLIST_ERROR, node->related_ast_node->line_number, node->related_ast_node->file_number, "Odin only supports constant shifts at present\n");
01153 }
01154
01155 buf_node = make_1port_gate(BUF_NODE, width, width, node, mark);
01156
01157 if (type == SL)
01158 {
01159
01160
01161
01162 for(i = 0; i < width - shift_size; i++)
01163 {
01164
01165 remap_pin_to_new_node(node->input_pins[i], buf_node, i+shift_size);
01166 }
01167
01168
01169 for(i = 0; i < shift_size; i++)
01170 {
01171
01172 add_a_input_pin_to_node_spot_idx(buf_node, get_a_zero_pin(netlist), i);
01173 }
01174
01175 for(i = width-1; i >= width-shift_size; i--)
01176 {
01177
01178 int idx_2_buffer = node->input_pins[i]->pin_net_idx;
01179 node->input_pins[i]->net->fanout_pins[idx_2_buffer] = NULL;
01180 }
01181 }
01182 else
01183 {
01184
01185
01186
01187 for(i = width - 1; i >= shift_size; i--)
01188 {
01189
01190 remap_pin_to_new_node(node->input_pins[i], buf_node, i-shift_size);
01191 }
01192
01193
01194 for(i = width - 1; i >= width - shift_size; i--)
01195 {
01196
01197 add_a_input_pin_to_node_spot_idx(buf_node, get_a_zero_pin(netlist), i);
01198 }
01199 for(i = 0; i < shift_size; i++)
01200 {
01201
01202 int idx_2_buffer = node->input_pins[i]->pin_net_idx;
01203 node->input_pins[i]->net->fanout_pins[idx_2_buffer] = NULL;
01204 }
01205 }
01206
01207 for(i = 0; i < width; i++)
01208 {
01209 remap_pin_to_new_node(node->output_pins[i], buf_node, i);
01210 }
01211
01212 instantiate_buffer(buf_node, mark, netlist);
01213 }
01214