How to get driving net of an instance
From Verific Design Automation FAQ
Revision as of 17:40, 12 August 2021 by Vince (Talk | contribs) (Created page with "C++: <nowiki> #include "Strings.h" #include "Array.h" #include "Message.h" #include "veri_nl_file.h" #include "DataBase.h" #include "VeriWrite.h" #ifdef VERIFIC_NAMESPACE us...")
C++:
#include "Strings.h"
#include "Array.h"
#include "Message.h"
#include "veri_nl_file.h"
#include "DataBase.h"
#include "VeriWrite.h"
#ifdef VERIFIC_NAMESPACE
using namespace Verific ;
#endif
int main()
{
if (!veri_nl_file::Read("mid.v","work")) return 1 ;
Netlist *mid = Netlist::PresentDesign() ;
if (!mid) {
Message::PrintLine("cannot find any handle to 'mid' netlist") ;
return 2 ;
}
if (!veri_nl_file::Read("top.v","work")) return 3 ;
Netlist *top = Netlist::PresentDesign() ;
if (!top) {
Message::PrintLine("cannot find any handle to 'top' netlist") ;
return 4 ;
}
VeriWrite veriWriter;
// Write out the design before any modifications
if (!veriWriter.WriteFile("before.v", top)) return 4 ;
// Lets get a handle to instance 'mid_bot'
Instance *bot_inst = mid->GetInst("mid_bot");
if (!bot_inst) {
Message::PrintLine("cannot find instance 'mid_bot' netlist") ;
return 5 ;
}
Netlist *bot_nl = bot_inst->View();
if (!bot_nl) {
Message::PrintLine("cannot find netlist (view) of instance 'mid_bot'") ;
return 5 ;
}
Port *bot_port = bot_nl->GetPort ("i");
if (!bot_port) {
Message::PrintLine("cannot find port") ;
return 5 ;
}
// Get the portref for port 'i' of 'mid_bot'
PortRef *bot_pr = bot_inst->GetPortRef(bot_port);
if (!bot_pr) {
Message::PrintLine("cannot find portref");
return 5 ;
}
Net *net = bot_pr->GetNet();
if (!net) {
Message::PrintLine("cannot find net") ;
return 5 ;
}
Netlist *view = bot_inst->Owner();
if (!view) {
Message::PrintLine("cannot find view");
return 5 ;
}
if (view->NumOfRefs() > 1) {
// This netlist is instantiated more than once; need to uniquify it to ensure unique driving nets
SetIter i ;
Instance *inst ;
FOREACH_REFERENCE_OF_NETLIST (view, i, inst) {
if (!Strings::compare (inst->Name(), "top_mid_2")) continue; // Only interested in instance "top_mid_2"
Cell *owner = view->Owner() ;
Netlist *new_netlist = view->Copy() ;
new_netlist->SetName(0) ; // Force a made-up name for the new netlist
if (owner) (void) owner->Add(new_netlist) ;
// Swap the instance to the new netlist
inst->ReplaceView(new_netlist, 0 /* By port order is faster */, 0 /* By port bit is faster */) ;
view = new_netlist ;
}
}
Message::PrintLine("**** In Netlist '", view->Name(), "' of cell '", view->Owner()->Name(), "'");
Message::PrintLine(" Found net '", net->Name(), "'");
Message::PrintLine(" driving port '", bot_port->Name(), "' of instance '", bot_inst->Name(), "'");
// Write out the design after uniquification
if (!veriWriter.WriteFile("after.v", top)) return 4 ;
return 0 ;
}
top.v
module top (output topo2, topo1, input topi2, topi1); mid top_mid_1 (topo1, topi1); mid top_mid_2 (topo2, topi2); endmodule
mid.v
module bot (output o, input i); endmodule module mid(output mido, input midi); bot mid_bot (mido, midi); endmodule
Run Output :
-- Reading structural Verilog file 'mid.v' (VNLR-1084) mid.v(1): INFO: compiling module 'bot' (VNLR-1012) mid.v(4): INFO: compiling module 'mid' (VNLR-1012) mid.v(4): INFO: setting 'mid' as the top level module (VNLR-1015) -- Reading structural Verilog file 'top.v' (VNLR-1084) top.v(1): INFO: compiling module 'top' (VNLR-1012) top.v(1): INFO: setting 'top' as the top level module (VNLR-1015) -- Writing netlist 'top' to Verilog file 'before.v' (VDB-1030) -- **** In Netlist 'v1' of cell 'mid' -- Found net 'midi' -- driving port 'i' of instance 'mid_bot' -- Writing netlist 'top' to Verilog file 'after.v' (VDB-1030)