@@ -115,6 +115,8 @@ static int get_num_covered_nodes(stages_t* s);
115
115
static int is_node_ready (nnode_t * node, int cycle);
116
116
static int is_node_complete (nnode_t * node, int cycle);
117
117
118
+ static bool pin_is_driver ( npin_t * pin, nnet_t * net );
119
+
118
120
static bool compute_and_store_value (nnode_t * node, int cycle);
119
121
static void compute_memory_node (nnode_t * node, int cycle);
120
122
static void compute_hard_ip_node (nnode_t * node, int cycle);
@@ -549,7 +551,11 @@ static int is_node_ready(nnode_t* node, int cycle) {
549
551
for (i = 0 ; i < node->num_input_pins ; i++) {
550
552
npin_t * pin = node->input_pins [i];
551
553
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) {
553
559
bool already_flagged = false ;
554
560
int j;
555
561
for (j = 0 ; j < node->num_undriven_pins ; j++) {
@@ -1175,6 +1181,17 @@ int get_clock_ratio(nnode_t* node) {
1175
1181
return node->ratio ;
1176
1182
}
1177
1183
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
+
1178
1195
/*
1179
1196
* Gets the children of the given node. Returns the number of
1180
1197
* children via the num_children parameter. Throws warnings
@@ -1189,25 +1206,27 @@ nnode_t** get_children_of(nnode_t* node, int* num_children) {
1189
1206
nnet_t * net = pin->net ;
1190
1207
if (net) {
1191
1208
/*
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.
1194
1210
*/
1195
- if (net-> driver_pin != pin && global_args.all_warnings ) {
1211
+ if (! pin_is_driver ( pin, net) && global_args.all_warnings ) {
1196
1212
char * pin_name = get_pin_name (pin->name );
1197
1213
char * node_name = get_pin_name (node->name );
1198
1214
char * net_name = get_pin_name (net->name );
1199
1215
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
+
1200
1222
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 (),
1203
1224
pin_name,
1204
1225
pin->unique_id ,
1205
1226
node_name,
1206
1227
node->unique_id ,
1207
1228
net_name,
1208
- net->unique_id ,
1209
- net->driver_pin ->name ,
1210
- net->driver_pin ->unique_id );
1229
+ net->unique_id );
1211
1230
1212
1231
vtr::free (net_name);
1213
1232
vtr::free (pin_name);
@@ -1220,19 +1239,30 @@ nnode_t** get_children_of(nnode_t* node, int* num_children) {
1220
1239
if (fanout_pin && fanout_pin->type == INPUT && fanout_pin->node ) {
1221
1240
nnode_t * child_node = fanout_pin->node ;
1222
1241
1242
+ bool error = false ;
1223
1243
// Check linkage for inconsistencies.
1224
1244
if (fanout_pin->net != net) {
1225
1245
print_ancestry (child_node, 0 );
1226
1246
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 ;
1230
1248
}
1231
1249
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
+ {
1236
1266
// Add child.
1237
1267
children = (nnode_t **)vtr::realloc (children, sizeof (nnode_t *) * (count + 1 ));
1238
1268
children[count++] = child_node;
@@ -1263,25 +1293,27 @@ nnode_t** get_children_of_nodepin(nnode_t* node, int* num_children, int output_p
1263
1293
nnet_t * net = pin->net ;
1264
1294
if (net) {
1265
1295
/*
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.
1268
1297
*/
1269
- if (net-> driver_pin != pin && global_args.all_warnings ) {
1298
+ if (! pin_is_driver ( pin, net) && global_args.all_warnings ) {
1270
1299
char * pin_name = get_pin_name (pin->name );
1271
1300
char * node_name = get_pin_name (node->name );
1272
1301
char * net_name = get_pin_name (net->name );
1273
1302
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
+
1274
1309
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 (),
1277
1311
pin_name,
1278
1312
pin->unique_id ,
1279
1313
node_name,
1280
1314
node->unique_id ,
1281
1315
net_name,
1282
- net->unique_id ,
1283
- net->driver_pin ->name ,
1284
- net->driver_pin ->unique_id );
1316
+ net->unique_id );
1285
1317
1286
1318
vtr::free (net_name);
1287
1319
vtr::free (pin_name);
@@ -1294,19 +1326,30 @@ nnode_t** get_children_of_nodepin(nnode_t* node, int* num_children, int output_p
1294
1326
if (fanout_pin && fanout_pin->type == INPUT && fanout_pin->node ) {
1295
1327
nnode_t * child_node = fanout_pin->node ;
1296
1328
1329
+ bool error = false ;
1297
1330
// Check linkage for inconsistencies.
1298
1331
if (fanout_pin->net != net) {
1299
1332
print_ancestry (child_node, 0 );
1300
1333
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 ;
1304
1335
}
1305
1336
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
+ {
1310
1353
// Add child.
1311
1354
children = (nnode_t **)vtr::realloc (children, sizeof (nnode_t *) * (count + 1 ));
1312
1355
children[count++] = child_node;
@@ -1331,8 +1374,9 @@ nnode_t** get_children_of_nodepin(nnode_t* node, int* num_children, int output_p
1331
1374
*/
1332
1375
static void initialize_pin (npin_t * pin) {
1333
1376
// 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]);
1336
1380
1337
1381
// If initialising the driver initialised this pin, we're OK to return.
1338
1382
if (pin->values )
@@ -1649,23 +1693,24 @@ static void compute_add_node(nnode_t* node, int cycle, int type) {
1649
1693
oassert (node->num_input_port_sizes == 3 );
1650
1694
oassert (node->num_output_port_sizes == 2 );
1651
1695
1652
- int i, num ;
1696
+ int i;
1653
1697
int flag = 0 ;
1654
1698
1655
1699
int * a = (int *)vtr::malloc (sizeof (int ) * node->input_port_sizes [0 ]);
1656
1700
int * b = (int *)vtr::malloc (sizeof (int ) * node->input_port_sizes [1 ]);
1657
1701
int * c = (int *)vtr::malloc (sizeof (int ) * node->input_port_sizes [2 ]);
1658
1702
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];
1660
1704
// 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
1661
1705
// 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;
1669
1714
1670
1715
for (i = 0 ; i < node->input_port_sizes [0 ]; i++)
1671
1716
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) {
1784
1829
for (i = 0 ; i < node->input_port_sizes [0 ]; i++)
1785
1830
a[i] = get_pin_value (node->input_pins [i], cycle);
1786
1831
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);
1792
1838
1793
1839
int * result = unary_sub_arrays (a, node->input_port_sizes [0 ], c, node->input_port_sizes [1 ]);
1794
1840
@@ -1846,7 +1892,7 @@ static void compute_memory_node(nnode_t* node, int cycle) {
1846
1892
}
1847
1893
1848
1894
/* *
1849
- * compute the address
1895
+ * compute the address
1850
1896
*/
1851
1897
static long compute_address (signal_list_t * input_address, int cycle) {
1852
1898
long address = 0 ;
@@ -3091,13 +3137,17 @@ static void print_ancestry(nnode_t* bottom_node, int n) {
3091
3137
int i;
3092
3138
for (i = 0 ; i < node->num_input_pins ; i++) {
3093
3139
npin_t * pin = node->input_pins [i];
3140
+ printf (" \t %s:\t " , pin->mapping );
3094
3141
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
+ }
3099
3150
fflush (stdout);
3100
- vtr::free (name2);
3101
3151
}
3102
3152
3103
3153
/* int count = 0;
@@ -3198,7 +3248,8 @@ static nnode_t* print_update_trace(nnode_t* bottom_node, int cycle) {
3198
3248
for (i = 0 ; i < node->num_input_pins ; i++) {
3199
3249
npin_t * pin = node->input_pins [i];
3200
3250
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
3202
3253
3203
3254
// If an input is found which hasn't been updated since before cycle-1, traverse it.
3204
3255
bool is_undriven = false ;
0 commit comments