@@ -115,6 +115,8 @@ static int get_num_covered_nodes(stages_t* s);
115115static int is_node_ready (nnode_t * node, int cycle);
116116static int is_node_complete (nnode_t * node, int cycle);
117117
118+ static bool pin_is_driver ( npin_t * pin, nnet_t * net );
119+
118120static bool compute_and_store_value (nnode_t * node, int cycle);
119121static void compute_memory_node (nnode_t * node, int cycle);
120122static void compute_hard_ip_node (nnode_t * node, int cycle);
@@ -549,7 +551,11 @@ static int is_node_ready(nnode_t* node, int cycle) {
549551 for (i = 0 ; i < node->num_input_pins ; i++) {
550552 npin_t * pin = node->input_pins [i];
551553
552- if (!pin->net || !pin->net ->driver_pin || !pin->net ->driver_pin ->node ) {
554+ bool has_missing_driver = false ;
555+ for (int j = 0 ; j < pin->net ->num_driver_pins && !has_missing_driver; j++)
556+ has_missing_driver = pin->net ->driver_pins [j]->node == NULL ;
557+
558+ if (!pin->net || has_missing_driver) {
553559 bool already_flagged = false ;
554560 int j;
555561 for (j = 0 ; j < node->num_undriven_pins ; j++) {
@@ -1175,6 +1181,17 @@ int get_clock_ratio(nnode_t* node) {
11751181 return node->ratio ;
11761182}
11771183
1184+ /* *
1185+ * Checks if the pin is one of the drivers of the provided net
1186+ */
1187+ static bool pin_is_driver ( npin_t * pin, nnet_t * net )
1188+ {
1189+ for (int j = 0 ; j < net->num_driver_pins ; j++)
1190+ if (net->driver_pins [j] == pin)
1191+ return true ;
1192+ return false ;
1193+ }
1194+
11781195/*
11791196 * Gets the children of the given node. Returns the number of
11801197 * children via the num_children parameter. Throws warnings
@@ -1189,25 +1206,27 @@ nnode_t** get_children_of(nnode_t* node, int* num_children) {
11891206 nnet_t * net = pin->net ;
11901207 if (net) {
11911208 /*
1192- * Detects a net that may be being driven by two
1193- * or more pins or has an incorrect driver pin assignment.
1209+ * Detects a net that has an incorrect driver pin assignment.
11941210 */
1195- if (net-> driver_pin != pin && global_args.all_warnings ) {
1211+ if (! pin_is_driver ( pin, net) && global_args.all_warnings ) {
11961212 char * pin_name = get_pin_name (pin->name );
11971213 char * node_name = get_pin_name (node->name );
11981214 char * net_name = get_pin_name (net->name );
11991215
1216+ std::string format_message =
1217+ " Found output pin \" %s\" (%ld) on node \" %s\" (%ld)\n "
1218+ " which is mapped to a net \" %s\" (%ld) whose driver pins are:\n " ;
1219+ for (int j = 0 ; j < net->num_driver_pins ; j++)
1220+ format_message += " " + std::string (net->driver_pins [j]->name ) + " (" + std::to_string (net->driver_pins [j]->unique_id ) + " )\n " ;
1221+
12001222 warning_message (SIMULATION, -1 , -1 ,
1201- " Found output pin \" %s\" (%ld) on node \" %s\" (%ld)\n "
1202- " which is mapped to a net \" %s\" (%ld) whose driver pin is \" %s\" (%ld) \n " ,
1223+ format_message.c_str (),
12031224 pin_name,
12041225 pin->unique_id ,
12051226 node_name,
12061227 node->unique_id ,
12071228 net_name,
1208- net->unique_id ,
1209- net->driver_pin ->name ,
1210- net->driver_pin ->unique_id );
1229+ net->unique_id );
12111230
12121231 vtr::free (net_name);
12131232 vtr::free (pin_name);
@@ -1220,19 +1239,30 @@ nnode_t** get_children_of(nnode_t* node, int* num_children) {
12201239 if (fanout_pin && fanout_pin->type == INPUT && fanout_pin->node ) {
12211240 nnode_t * child_node = fanout_pin->node ;
12221241
1242+ bool error = false ;
12231243 // Check linkage for inconsistencies.
12241244 if (fanout_pin->net != net) {
12251245 print_ancestry (child_node, 0 );
12261246 error_message (SIMULATION, -1 , -1 , " Found mismapped node %s" , node->name );
1227- } else if (fanout_pin->net ->driver_pin ->net != net) {
1228- print_ancestry (child_node, 0 );
1229- error_message (SIMULATION, -1 , -1 , " Found mismapped node %s" , node->name );
1247+ error = true ;
12301248 }
12311249
1232- else if (fanout_pin->net ->driver_pin ->node != node) {
1233- print_ancestry (child_node, 0 );
1234- error_message (SIMULATION, -1 , -1 , " Found mismapped node %s" , node->name );
1235- } else {
1250+ oassert ( fanout_pin->net ->num_driver_pins > 0 && " Expected at least one driver pin" );
1251+ for (int k = 0 ; k < fanout_pin->net ->num_driver_pins && !error; k++) {
1252+ if (fanout_pin->net ->driver_pins [k]->net != net) {
1253+ print_ancestry (child_node, 0 );
1254+ error_message (SIMULATION, -1 , -1 , " Found mismapped node %s" , node->name );
1255+ error = true ;
1256+ }
1257+ else if (fanout_pin->net ->driver_pins [k]->node != node) {
1258+ print_ancestry (child_node, 0 );
1259+ error_message (SIMULATION, -1 , -1 , " Found mismapped node %s" , node->name );
1260+ error = true ;
1261+ }
1262+ }
1263+
1264+ if (!error)
1265+ {
12361266 // Add child.
12371267 children = (nnode_t **)vtr::realloc (children, sizeof (nnode_t *) * (count + 1 ));
12381268 children[count++] = child_node;
@@ -1263,25 +1293,27 @@ nnode_t** get_children_of_nodepin(nnode_t* node, int* num_children, int output_p
12631293 nnet_t * net = pin->net ;
12641294 if (net) {
12651295 /*
1266- * Detects a net that may be being driven by two
1267- * or more pins or has an incorrect driver pin assignment.
1296+ * Detects a net that has an incorrect driver pin assignment.
12681297 */
1269- if (net-> driver_pin != pin && global_args.all_warnings ) {
1298+ if (! pin_is_driver ( pin, net) && global_args.all_warnings ) {
12701299 char * pin_name = get_pin_name (pin->name );
12711300 char * node_name = get_pin_name (node->name );
12721301 char * net_name = get_pin_name (net->name );
12731302
1303+ std::string format_message =
1304+ " Found output pin \" %s\" (%ld) on node \" %s\" (%ld)\n "
1305+ " which is mapped to a net \" %s\" (%ld) whose driver pins are:\n " ;
1306+ for (int j = 0 ; j < net->num_driver_pins ; j++)
1307+ format_message += " " + std::string (net->driver_pins [j]->name ) + " (" + std::to_string (net->driver_pins [j]->unique_id ) + " )\n " ;
1308+
12741309 warning_message (SIMULATION, -1 , -1 ,
1275- " Found output pin \" %s\" (%ld) on node \" %s\" (%ld)\n "
1276- " which is mapped to a net \" %s\" (%ld) whose driver pin is \" %s\" (%ld) \n " ,
1310+ format_message.c_str (),
12771311 pin_name,
12781312 pin->unique_id ,
12791313 node_name,
12801314 node->unique_id ,
12811315 net_name,
1282- net->unique_id ,
1283- net->driver_pin ->name ,
1284- net->driver_pin ->unique_id );
1316+ net->unique_id );
12851317
12861318 vtr::free (net_name);
12871319 vtr::free (pin_name);
@@ -1294,19 +1326,30 @@ nnode_t** get_children_of_nodepin(nnode_t* node, int* num_children, int output_p
12941326 if (fanout_pin && fanout_pin->type == INPUT && fanout_pin->node ) {
12951327 nnode_t * child_node = fanout_pin->node ;
12961328
1329+ bool error = false ;
12971330 // Check linkage for inconsistencies.
12981331 if (fanout_pin->net != net) {
12991332 print_ancestry (child_node, 0 );
13001333 error_message (SIMULATION, -1 , -1 , " Found mismapped node %s" , node->name );
1301- } else if (fanout_pin->net ->driver_pin ->net != net) {
1302- print_ancestry (child_node, 0 );
1303- error_message (SIMULATION, -1 , -1 , " Found mismapped node %s" , node->name );
1334+ error = true ;
13041335 }
13051336
1306- else if (fanout_pin->net ->driver_pin ->node != node) {
1307- print_ancestry (child_node, 0 );
1308- error_message (SIMULATION, -1 , -1 , " Found mismapped node %s" , node->name );
1309- } else {
1337+ oassert ( fanout_pin->net ->num_driver_pins > 0 && " Expected at least one driver pin" );
1338+ for (int k = 0 ; k < fanout_pin->net ->num_driver_pins && !error; k++) {
1339+ if (fanout_pin->net ->driver_pins [k]->net != net) {
1340+ print_ancestry (child_node, 0 );
1341+ error_message (SIMULATION, -1 , -1 , " Found mismapped node %s" , node->name );
1342+ error = true ;
1343+ }
1344+ else if (fanout_pin->net ->driver_pins [k]->node != node) {
1345+ print_ancestry (child_node, 0 );
1346+ error_message (SIMULATION, -1 , -1 , " Found mismapped node %s" , node->name );
1347+ error = true ;
1348+ }
1349+ }
1350+
1351+ if (!error)
1352+ {
13101353 // Add child.
13111354 children = (nnode_t **)vtr::realloc (children, sizeof (nnode_t *) * (count + 1 ));
13121355 children[count++] = child_node;
@@ -1331,8 +1374,9 @@ nnode_t** get_children_of_nodepin(nnode_t* node, int* num_children, int output_p
13311374 */
13321375static void initialize_pin (npin_t * pin) {
13331376 // Initialise the driver pin if this pin is not the driver.
1334- if (pin->net && pin->net ->driver_pin && pin->net ->driver_pin != pin)
1335- initialize_pin (pin->net ->driver_pin );
1377+ if (pin->net && !pin_is_driver (pin, pin->net ))
1378+ for (int i = 0 ; i < pin->net ->num_driver_pins ; i++)
1379+ initialize_pin (pin->net ->driver_pins [i]);
13361380
13371381 // If initialising the driver initialised this pin, we're OK to return.
13381382 if (pin->values )
@@ -1649,23 +1693,24 @@ static void compute_add_node(nnode_t* node, int cycle, int type) {
16491693 oassert (node->num_input_port_sizes == 3 );
16501694 oassert (node->num_output_port_sizes == 2 );
16511695
1652- int i, num ;
1696+ int i;
16531697 int flag = 0 ;
16541698
16551699 int * a = (int *)vtr::malloc (sizeof (int ) * node->input_port_sizes [0 ]);
16561700 int * b = (int *)vtr::malloc (sizeof (int ) * node->input_port_sizes [1 ]);
16571701 int * c = (int *)vtr::malloc (sizeof (int ) * node->input_port_sizes [2 ]);
16581702
1659- num = node->input_port_sizes [0 ] + node->input_port_sizes [1 ];
1703+ // int num = node->input_port_sizes[0] + node->input_port_sizes[1];
16601704 // if cin connect to unconn(PAD_NODE), a[0] connect to ground(GND_NODE) and b[0] connect to ground, flag = 0 the initial adder for addition
16611705 // if cin connect to unconn(PAD_NODE), a[0] connect to ground(GND_NODE) and b[0] connect to vcc, flag = 1 the initial adder for subtraction
1662- if (node->input_pins [num]->net ->driver_pin ->node ->type == PAD_NODE) {
1663- if (node->input_pins [0 ]->net ->driver_pin ->node ->type == GND_NODE && node->input_pins [node->input_port_sizes [0 ]]->net ->driver_pin ->node ->type == GND_NODE)
1664- flag = 0 ;
1665- else if (node->input_pins [0 ]->net ->driver_pin ->node ->type == GND_NODE && node->input_pins [node->input_port_sizes [0 ]]->net ->driver_pin ->node ->type == VCC_NODE)
1666- flag = 1 ;
1667- } else
1668- flag = 2 ;
1706+ #warning "Oops this be broke come fix"
1707+ // if (node->input_pins[num]->net->driver_pin->node->type == PAD_NODE) {
1708+ // if (node->input_pins[0]->net->driver_pin->node->type == GND_NODE && node->input_pins[node->input_port_sizes[0]]->net->driver_pin->node->type == GND_NODE)
1709+ // flag = 0;
1710+ // else if (node->input_pins[0]->net->driver_pin->node->type == GND_NODE && node->input_pins[node->input_port_sizes[0]]->net->driver_pin->node->type == VCC_NODE)
1711+ // flag = 1;
1712+ // } else
1713+ // flag = 2;
16691714
16701715 for (i = 0 ; i < node->input_port_sizes [0 ]; i++)
16711716 a[i] = get_pin_value (node->input_pins [i], cycle);
@@ -1784,11 +1829,12 @@ static void compute_unary_sub_node(nnode_t* node, int cycle) {
17841829 for (i = 0 ; i < node->input_port_sizes [0 ]; i++)
17851830 a[i] = get_pin_value (node->input_pins [i], cycle);
17861831
1787- for (i = 0 ; i < node->input_port_sizes [1 ]; i++)
1788- if (node->input_pins [node->input_port_sizes [0 ] + node->input_port_sizes [1 ] + i]->net ->driver_pin ->node ->type == PAD_NODE)
1789- c[i] = 1 ;
1790- else
1791- c[i] = get_pin_value (node->input_pins [node->input_port_sizes [0 ] + i], cycle);
1832+ #warning "Oops this be broke come fix"
1833+ // for (i = 0; i < node->input_port_sizes[1]; i++)
1834+ // if (node->input_pins[node->input_port_sizes[0] + node->input_port_sizes[1] + i]->net->driver_pin->node->type == PAD_NODE)
1835+ // c[i] = 1;
1836+ // else
1837+ // c[i] = get_pin_value(node->input_pins[node->input_port_sizes[0] + i], cycle);
17921838
17931839 int * result = unary_sub_arrays (a, node->input_port_sizes [0 ], c, node->input_port_sizes [1 ]);
17941840
@@ -1846,7 +1892,7 @@ static void compute_memory_node(nnode_t* node, int cycle) {
18461892}
18471893
18481894/* *
1849- * compute the address
1895+ * compute the address
18501896 */
18511897static long compute_address (signal_list_t * input_address, int cycle) {
18521898 long address = 0 ;
@@ -3091,13 +3137,17 @@ static void print_ancestry(nnode_t* bottom_node, int n) {
30913137 int i;
30923138 for (i = 0 ; i < node->num_input_pins ; i++) {
30933139 npin_t * pin = node->input_pins [i];
3140+ printf (" \t %s:\t " , pin->mapping );
30943141 nnet_t * net = pin->net ;
3095- nnode_t * node2 = net->driver_pin ->node ;
3096- queue.push (node2);
3097- char * name2 = get_pin_name (node2->name );
3098- printf (" \t %s %s (%ld)\n " , pin->mapping , name2, node2->unique_id );
3142+ // Print all the drivers
3143+ for (int j = 0 ; j < net->num_driver_pins ; j++) {
3144+ nnode_t * node2 = net->driver_pins [j]->node ;
3145+ queue.push (node2);
3146+ char * name2 = get_pin_name (node2->name );
3147+ printf (" %s (%ld)%s" , name2, node2->unique_id , j == net->num_driver_pins - 1 ? " \n " : " , " );
3148+ vtr::free (name2);
3149+ }
30993150 fflush (stdout);
3100- vtr::free (name2);
31013151 }
31023152
31033153 /* int count = 0;
@@ -3198,7 +3248,8 @@ static nnode_t* print_update_trace(nnode_t* bottom_node, int cycle) {
31983248 for (i = 0 ; i < node->num_input_pins ; i++) {
31993249 npin_t * pin = node->input_pins [i];
32003250 nnet_t * net = pin->net ;
3201- nnode_t * node2 = net->driver_pin ->node ;
3251+ #warning "Oops this be broke come fix"
3252+ nnode_t * node2 = net->driver_pins [0 ]->node ; // TODO Actually implement this
32023253
32033254 // If an input is found which hasn't been updated since before cycle-1, traverse it.
32043255 bool is_undriven = false ;
0 commit comments