Skip to content

Commit 05d9dab

Browse files
author
djns1
committed
WIP Driver refactor
1 parent bae8c5f commit 05d9dab

File tree

2 files changed

+126
-80
lines changed

2 files changed

+126
-80
lines changed

ODIN_II/SRC/netlist_create_from_ast.cpp

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3053,7 +3053,7 @@ void terminate_registered_assignment(ast_node_t* always_node, signal_list_t* ass
30533053

30543054
signal_list_t* memory_inputs = init_signal_list();
30553055
char* ref_string;
3056-
int i, j, dependence_variable_position;
3056+
int i, j;
30573057
for (i = 0; i < assignment->count; i++) {
30583058
npin_t* pin = assignment->pins[i];
30593059
implicit_memory* memory = lookup_implicit_memory_input(pin->name);
@@ -3140,25 +3140,26 @@ void terminate_registered_assignment(ast_node_t* always_node, signal_list_t* ass
31403140
}
31413141
}
31423142

3143-
for (i = 0; i < assignment->count; i++) {
3144-
npin_t* pin = assignment->pins[i];
3145-
dependence_variable_position = -1;
3146-
3147-
if (pin->net->driver_pin) {
3148-
ref_string = pin->net->driver_pin->node->name;
3149-
3150-
for (j = i - 1; j >= 0; j--) {
3151-
if (list_dependence_pin[j] && list_dependence_pin[j]->net->driver_pin && list_dependence_type[j] && list_dependence_type[j] == BLOCKING_STATEMENT && strcmp(ref_string, assignment->pins[j]->node->name) == 0) {
3152-
dependence_variable_position = j;
3153-
ref_string = list_dependence_pin[j]->net->driver_pin->node->name;
3154-
}
3155-
}
3156-
3157-
if (dependence_variable_position > -1) {
3158-
pin->net = list_dependence_pin[dependence_variable_position]->net;
3159-
}
3160-
}
3161-
}
3143+
#warning "Oops broke come back fix this"
3144+
// for (i = 0; i < assignment->count; i++) {
3145+
// npin_t* pin = assignment->pins[i];
3146+
// int dependence_variable_position = -1;
3147+
//
3148+
// if (pin->net->driver_pin) {
3149+
// ref_string = pin->net->driver_pin->node->name;
3150+
//
3151+
// for (j = i - 1; j >= 0; j--) {
3152+
// if (list_dependence_pin[j] && list_dependence_pin[j]->net->driver_pin && list_dependence_type[j] && list_dependence_type[j] == BLOCKING_STATEMENT && strcmp(ref_string, assignment->pins[j]->node->name) == 0) {
3153+
// dependence_variable_position = j;
3154+
// ref_string = list_dependence_pin[j]->net->driver_pin->node->name;
3155+
// }
3156+
// }
3157+
//
3158+
// if (dependence_variable_position > -1) {
3159+
// pin->net = list_dependence_pin[dependence_variable_position]->net;
3160+
// }
3161+
// }
3162+
// }
31623163
vtr::free(list_dependence_pin);
31633164
vtr::free(list_dependence_type);
31643165
for (i = 0; i < memory_inputs->count; i++) {
@@ -3238,12 +3239,6 @@ void terminate_continuous_assignment(ast_node_t* node, signal_list_t* assignment
32383239
npin_t* buf_output_pin = allocate_npin();
32393240
add_output_pin_to_node(buf_node, buf_output_pin, 0);
32403241

3241-
if (net->driver_pin != NULL) {
3242-
error_message(NETLIST, node->line_number, node->file_number,
3243-
"You've defined this driver %s twice. \n "
3244-
"\tNote that Odin II does not currently support combinational a = ? overiding for if and case blocks.\n",
3245-
pin->name);
3246-
}
32473242
add_driver_pin_to_net(net, buf_output_pin);
32483243
}
32493244
}

ODIN_II/SRC/simulate_blif.cpp

Lines changed: 105 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ static int get_num_covered_nodes(stages_t* s);
115115
static int is_node_ready(nnode_t* node, int cycle);
116116
static int is_node_complete(nnode_t* node, int cycle);
117117

118+
static bool pin_is_driver( npin_t* pin, nnet_t* net );
119+
118120
static bool compute_and_store_value(nnode_t* node, int cycle);
119121
static void compute_memory_node(nnode_t* node, int cycle);
120122
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) {
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
*/
13321375
static 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
*/
18511897
static 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

Comments
 (0)