aboutsummaryrefslogtreecommitdiff
path: root/src/parser/parse_tree.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/parse_tree.cpp')
-rw-r--r--src/parser/parse_tree.cpp29
1 files changed, 19 insertions, 10 deletions
diff --git a/src/parser/parse_tree.cpp b/src/parser/parse_tree.cpp
index bbafeb8..99dbcd3 100644
--- a/src/parser/parse_tree.cpp
+++ b/src/parser/parse_tree.cpp
@@ -29,7 +29,7 @@ vector<shared_ptr<sc_object>> ParseNet::create(const string &name, bool force_bi
else
{
assert(type() == OANALOG && "Only optical nets can be bidirectional for now");
- return { create_uni((name + "_0").c_str()), create_uni((name + "_1").c_str()) };
+ return { create_uni((name + ":0").c_str()), create_uni((name + ":1").c_str()) };
}
}
@@ -181,10 +181,18 @@ void ParseTreeCreationHelper::upgrade_signal(const string &net_name)
// The signal should exist because it has been created by pt_helper.create_signals()
// but it doesn't hurt to check once more time
assert(circuit_signals.find(net_name) != circuit_signals.end());
+ assert(circuit_signals.at(net_name).size() >= 1);
+ assert(circuit_signals.at(net_name).size() <= 2);
// Set the bidirectional flag to true
pt->nets[net_name].m_bidirectional = true;
+ if (circuit_signals.at(net_name).size() == 2)
+ {
+ // No need to upgrade the signal (it's already bidirectional)
+ return;
+ }
+
// Check if the net was created as unidirectional (only one signal)
if (circuit_signals.at(net_name).size() == 1)
{
@@ -196,10 +204,10 @@ void ParseTreeCreationHelper::upgrade_signal(const string &net_name)
// if yes, that means a port is already connected to the signal
// we cannot easily re-instantiate it as it may be bound to a port;
// instead, we add a second signal to the vector to make it bidirectional
- circuit_signals[net_name].push_back(pt->nets[net_name].create_uni(net_name + "_1"));
+ circuit_signals[net_name].push_back(pt->nets[net_name].create_uni(net_name + ":1"));
- // For bidirectional signals, first port to connect binds to signal_0
- // for writing and signal_1 for reading
+ // For bidirectional signals, first port to connect binds to signal:0
+ // for writing and signal:1 for reading
// Therefore we have to "re-create" this scenario, as if the first device
// connected to a bidirectional net. But for this we need to know which
// if the first device was a writer or a reader.
@@ -215,14 +223,14 @@ void ParseTreeCreationHelper::upgrade_signal(const string &net_name)
if (has_writer)
{
// if a writer, then it's as expected:
- // the next port will connect to signal_1 for writing
+ // the next port will connect to signal:1 for writing
// we just need to update the number of "readers" connected to the net
pt->nets[net_name].m_readers_count++;
}
else
{
// if a writer, then the next port needs to reverse its order.
- // for this we swap signal_0 and signal_1
+ // for this we swap signal:0 and signal:1
swap(circuit_signals[net_name][0], circuit_signals[net_name][1]);
// then we need to update the number of "writers" connected to the net
pt->nets[net_name].m_writers_count++;
@@ -230,10 +238,11 @@ void ParseTreeCreationHelper::upgrade_signal(const string &net_name)
}
else
{
- // otherwise, we can recreate the first signal as well
- circuit_signals[net_name].clear(); // will delete the net through the constructor
+ // otherwise, we can create the first signal as well
+ circuit_signals[net_name].clear(); // will delete the net through the destructor
circuit_signals[net_name] = pt->nets.at(net_name).create(net_name);
}
+ cout << "\t" << circuit_signals[net_name][0]->name() << "," << circuit_signals[net_name][1]->name() << endl;
}
}
@@ -716,7 +725,7 @@ void ParseTree::build_circuit()
{
auto it = elements_backlog.begin();
auto &backlog_elem = *it;
- cout << "Creating " << backlog_elem->name << " (reason: backlog)" << endl;
+ cout << "Creating - " << backlog_elem->name << " (reason: bidir backlog)" << endl;
auto mod = backlog_elem->create(pt_helper);
cout << "Done creating " << backlog_elem->name << endl;
@@ -769,7 +778,7 @@ void ParseTree::build_circuit()
{
auto it = elements_backlog.begin();
auto &backlog_elem = *it;
- cout << "Creating " << backlog_elem->name << " (reason: backlog)" << endl;
+ cout << "Creating " << backlog_elem->name << " (reason: unidir backlog)" << endl;
auto mod = backlog_elem->create(pt_helper);
cout << "Done creating " << backlog_elem->name << endl;