Skip to content

Commit 8193e56

Browse files
committed
fix memory padding on soft memory
1 parent 874d60e commit 8193e56

File tree

13 files changed

+349
-270
lines changed

13 files changed

+349
-270
lines changed

ODIN_II/SRC/hard_blocks.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,13 @@ void define_hard_block(nnode_t *node, short /*type*/, FILE *out)
169169
for (i = 0; i < node->num_input_pins; i++)
170170
{
171171
/* Check that the input pin is driven */
172-
if (node->input_pins[i]->net->driver_pin == NULL)
172+
if (node->input_pins[i]->net->driver_pin == NULL
173+
&& node->input_pins[i]->net != verilog_netlist->zero_net
174+
&& node->input_pins[i]->net != verilog_netlist->one_net
175+
&& node->input_pins[i]->net != verilog_netlist->pad_net)
173176
{
174-
printf("Signal %s is not driven. Odin will terminate.\n", node->input_pins[i]->name);
175-
exit(1);
177+
warning_message(NETLIST_ERROR, -1, -1, "Signal %s is not driven. padding with ground\n", node->input_pins[i]->name);
178+
add_fanout_pin_to_net(verilog_netlist->zero_net, node->input_pins[i]);
176179
}
177180

178181
if (node->input_port_sizes[port] == 1)

ODIN_II/SRC/include/odin_ii.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#define ODIN_II_H
33

44
struct netlist_t_t *start_odin_ii(int argc,char **argv);
5-
int terminate_odin_ii();
5+
int terminate_odin_ii(struct netlist_t_t *odin_netlist);
66

77
void set_default_config();
88
void get_options(int argc, char **argv);

ODIN_II/SRC/include/read_blif.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef READ_BLIF_H
22
#define READ_BLIF_H
33

4-
void read_blif();
4+
netlist_t *read_blif();
55
extern int line_count;
66

77
#endif

ODIN_II/SRC/include/types.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ typedef enum {
149149
/* the global arguments of the software */
150150
struct global_args_t_t
151151
{
152+
std::string program_name;
153+
152154
argparse::ArgValue<char*> config_file;
153155
argparse::ArgValue<std::vector<std::string>> verilog_files;
154156
argparse::ArgValue<char*> blif_file;

ODIN_II/SRC/memories.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,6 +1467,13 @@ void instantiate_soft_single_port_ram(nnode_t *node, short mark, netlist_t *netl
14671467
for (i = 0; i < num_addr; i++)
14681468
{
14691469
npin_t *address_pin = decoder->pins[i];
1470+
/* Check that the input pin is driven */
1471+
oassert(
1472+
address_pin->net->driver_pin != NULL
1473+
|| address_pin->net == verilog_netlist->zero_net
1474+
|| address_pin->net == verilog_netlist->one_net
1475+
|| address_pin->net == verilog_netlist->pad_net
1476+
);
14701477

14711478
// An AND gate to enable and disable writing.
14721479
nnode_t *and_g = make_1port_logic_gate(LOGICAL_AND, 2, node, mark);
@@ -1490,6 +1497,13 @@ void instantiate_soft_single_port_ram(nnode_t *node, short mark, netlist_t *netl
14901497
for (j = 0; j < num_addr; j++)
14911498
{
14921499
npin_t *address_pin = decoder->pins[j];
1500+
/* Check that the input pin is driven */
1501+
oassert(
1502+
address_pin->net->driver_pin != NULL
1503+
|| address_pin->net == verilog_netlist->zero_net
1504+
|| address_pin->net == verilog_netlist->one_net
1505+
|| address_pin->net == verilog_netlist->pad_net
1506+
);
14931507

14941508
// A multiplexer switches between accepting incoming data and keeping existing data.
14951509
nnode_t *mux = make_2port_gate(MUX_2, 2, 2, 1, node, mark);
@@ -1566,6 +1580,19 @@ void instantiate_soft_dual_port_ram(nnode_t *node, short mark, netlist_t *netlis
15661580
npin_t *addr1_pin = decoder1->pins[i];
15671581
npin_t *addr2_pin = decoder2->pins[i];
15681582

1583+
oassert(
1584+
addr1_pin->net->driver_pin != NULL
1585+
|| addr1_pin->net == verilog_netlist->zero_net
1586+
|| addr1_pin->net == verilog_netlist->one_net
1587+
|| addr1_pin->net == verilog_netlist->pad_net
1588+
);
1589+
oassert(
1590+
addr2_pin->net->driver_pin != NULL
1591+
|| addr2_pin->net == verilog_netlist->zero_net
1592+
|| addr2_pin->net == verilog_netlist->one_net
1593+
|| addr2_pin->net == verilog_netlist->pad_net
1594+
);
1595+
15691596
// Write enable and gate for address 1.
15701597
nnode_t *and1 = make_1port_logic_gate(LOGICAL_AND, 2, node, mark);
15711598
add_input_pin_to_node(and1, addr1_pin, 0);
@@ -1606,6 +1633,19 @@ void instantiate_soft_dual_port_ram(nnode_t *node, short mark, netlist_t *netlis
16061633
npin_t *addr1_pin = decoder1->pins[j];
16071634
npin_t *addr2_pin = decoder2->pins[j];
16081635

1636+
oassert(
1637+
addr1_pin->net->driver_pin != NULL
1638+
|| addr1_pin->net == verilog_netlist->zero_net
1639+
|| addr1_pin->net == verilog_netlist->one_net
1640+
|| addr1_pin->net == verilog_netlist->pad_net
1641+
);
1642+
oassert(
1643+
addr2_pin->net->driver_pin != NULL
1644+
|| addr2_pin->net == verilog_netlist->zero_net
1645+
|| addr2_pin->net == verilog_netlist->one_net
1646+
|| addr2_pin->net == verilog_netlist->pad_net
1647+
);
1648+
16091649
// The data mux selects between the two data lines for this address.
16101650
nnode_t *data_mux = make_2port_gate(MUX_2, 2, 2, 1, node, mark);
16111651
// Port 2 before 1 to mimic the simulator's behaviour when the addresses are the same.
@@ -1686,6 +1726,15 @@ signal_list_t *create_decoder(nnode_t *node, short mark, signal_list_t *input_li
16861726
int i;
16871727
for (i = 0; i < num_inputs; i++)
16881728
{
1729+
if(input_list->pins[i]->net->driver_pin == NULL
1730+
&& input_list->pins[i]->net != verilog_netlist->zero_net
1731+
&& input_list->pins[i]->net != verilog_netlist->one_net
1732+
&& input_list->pins[i]->net != verilog_netlist->pad_net)
1733+
{
1734+
warning_message(NETLIST_ERROR, -1, -1, "Signal %s is not driven. padding with ground\n", input_list->pins[i]);
1735+
add_fanout_pin_to_net(verilog_netlist->zero_net, input_list->pins[i]);
1736+
}
1737+
16891738
nnode_t *not_g = make_not_gate(node, mark);
16901739
remap_pin_to_new_node(input_list->pins[i], not_g, 0);
16911740
npin_t *not_output = allocate_npin();

ODIN_II/SRC/netlist_utils.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,9 @@ netlist_t* allocate_netlist()
895895
*-------------------------------------------------------------------------------------------*/
896896
void free_netlist(netlist_t *to_free)
897897
{
898+
if(!to_free)
899+
return;
900+
898901
sc_free_string_cache(to_free->nets_sc);
899902
sc_free_string_cache(to_free->out_pins_sc);
900903
sc_free_string_cache(to_free->nodes_sc);

0 commit comments

Comments
 (0)