8000 Internal error `Broken link in node` · Issue #3875 · verilator/verilator · GitHub
[go: up one dir, main page]

Skip to content

Internal error Broken link in node #3875

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
goekce opened this issue Jan 14, 2023 · 15 comments · May be fi 8000 xed by #4629
Open

Internal error Broken link in node #3875

goekce opened this issue Jan 14, 2023 · 15 comments · May be fixed by #4629
Labels
area: elaboration Issue involves elaboration phase status: ready Issue is ready for someone to fix; then goes to 'status: assigned'

Comments

@goekce
Copy link
Contributor
goekce commented Jan 14, 2023

#3874 contains the test code which leads to the error. The modifications stated in the comments lead to a successful compilation:

interface intf #(A=0);  // `A=1` ok
        typedef logic logic_t;

        function logic_t f();  // logic_t => `logic` ok
                return 0;
        endfunction

        modport if_m (
                import f
        );
endinterface

module system;
        intf #(1) intf1();  // `1` => `0` ok.
        m m0(.*);
endmodule

module m (intf.if_m intf1);
//using `initial` ok
        if (intf1.f())  // `if(0)` ok
                $error();

Error:

%Error: Internal Error: t/t_interface_parameter_function.v:12:11: ../V3Broken.cpp:173: 
Broken link in node (or something without maybePointedTo):
'm_refDTypep && !m_refDTypep->brokeExists()' @ ../V3AstNodes.cpp:1784
   12 |  function logic_t f();
      |           ^~~~~~~

No errors in Vivado.

@goekce goekce added the new New issue not seen by maintainers label Jan 14, 2023
@goekce
Copy link
Contributor Author
goekce commented Jan 15, 2023

Note that if is a generate statement which expects a elaboration time constant expression. VCS and vsim do not seem to accept any external functions in the if statement, but Verilator does. Verilator compiles the following without errors.

module mm;
  function logic f();
    return 0;
  endfunction
endmodule

module m;
  mm mm1();
  if (mm1.f()) 
    $error("ok\n")
endmodule

But the bug is probably related to typedef anyway.

< 8000 div class="js-timeline-item js-timeline-progressive-focus-container" data-gid="UNLE_lADOC29HiM5bZjFkzwAAAAHrx15n">
@wsnyder wsnyder added area: elaboration Issue involves elaboration phase status: ready Issue is ready for someone to fix; then goes to 'status: assigned' and removed new New issue not seen by maintainers labels Jan 17, 2023
@wsnyder
Copy link
Member
wsnyder commented Jan 17, 2023

When the interface is elaborated it seems to get a confused data type. Needs some more debug - perhaps you'd like to take a look at a pull to fix this?

@goekce
Copy link
Contributor Author
goekce commented Jan 24, 2023

I am trying to find the cause for the segfault and have some questions.

The segfault happens during V3Dead pass. In debugging mode V3Broken::brokenAll is used to check the tree for broken links. It is recursively run on the children of any node. The segfault happens after deadifying the modules m and intf (probably because their parametered, constrained copies are used).

My hunch is V3Dead creates a dangling pointer during edit, but I have difficulties finding this pointer. Here is an excerpt from my debugging session:

Breakpoint 27, BrokenCheckVisitor::processAndIterate (this=0x7fffffffdd90, nodep=0x555556166ab0) at ../V3Broken.cpp:198                                                                                                                      
198             processEnter(nodep);                                                                                                                                                                                                         
(gdb)                                                                                                                                                                                                                                        
199             iterateChildrenConst(nodep);                                                                                                                                                                                                 
(gdb) pnt nodep                                                                                                                                                                                                                              
This=TYPETABLE 0x555556166ab0 back=0x5555561663a0 next=0x555556166c90 headtail=0x555556166c90 op1p=0x555556184f40                                                                                                                            
  Fileline = <built-in>:0:0:                                                                                                                                                                                                                 
     TYPETABLE 0x555556166ab0 <e2> {a0aa}                                                                                                                                                                                                    
                detailed  ->  BASICDTYPE 0x555556183f00 <e166> {c13ak} @dt=this@(G/w1)  logic [GENERIC] kwd=logic                                                                                                                            
                detailed  ->  BASICDTYPE 0x555556182540 <e222> {c9as} @dt=this@(G/nw1)  LOGIC_IMPLICIT [GENERIC] kwd=LOGIC_IMPLICIT                                                                                                          
                detailed  ->  BASICDTYPE 0x555556184f40 <e11> {c9au} @dt=this@(G/swu32/1)  logic [GENERIC] kwd=logic range=[31:0]                                                                                                            
                detailed  ->  BASICDTYPE 0x5555561f7460 <e77> {c28ad} @dt=this@(G/str)  string [GENERIC] kwd=string                                                                                                                          
         This=TYPETABLE 0x555556166ab0 back=0x5555561663a0 next=0x555556166c90 headtail=0x555556166c90 op1p=0x555556184f40                                                                                                                   
    1: BASICDTYPE 0x555556184f40 <e11> {c9au} @dt=this@(G/swu32/1)  logic [GENERIC] kwd=logic range=[31:0]                                                                                                                                   
    1:     This=BASICDTYPE 0x555556184f40 back=0x555556166ab0 next=0x5555561f7460 headtail=0x555556182540                                                                                                                                    
- V3FileLine.cpp:169: Get Stream[ct1+14]: interface intf #(A=0);                                                                                                                                                                             
    9 | interface intf #(A=0);                                                                                                                                                                                                               
      |                    ^                                                                                                                                                                                                                 
    1: BASICDTYPE 0x5555561f7460 <e77> {c28ad} @dt=this@(G/str)  string [GENERIC] kwd=string                                                                                                                                                 
    1:     This=BASICDTYPE 0x5555561f7460 back=0x555556184f40 next=0x5555561f4740 headtail=0                                                                                                                                                 
- V3FileLine.cpp:169: Get Stream[ct1+35]:               $error();                                                                                                                                                                            
   28 |   $error();                                                                                                                                                                                                                          
      |   ^~~~~~                                                                                                                                                                                                                             
                                                                                                                                                                                                                                             
Program received signal SIGSEGV, Segmentation fault.                                                                                                                                                                                         
AstNode::privateAs<AstRange, AstNode*> (nodep=0x1) at ../V3Ast.h:108                                                                                                                                                                         
108     constexpr bool operator==(const VNType& lhs, VNType::en rhs) { return lhs.m_e == rhs; }
...
(gdb) where
#0  AstNode::privateAs<AstRange, AstNode*> (nodep=0x1) at ../V3Ast.h:108
#1  0x0000555555812d4f in AstBasicDType::rangep (this=0x555556185310) at ../V3AstNodeDType.h:396                      
#2  AstBasicDType::isRanged (this=this@entry=0x555556185310) at ../V3AstNodeDType.h:450                               
#3  0x0000555555804a56 in AstBasicDType::dump (this=0x555556185310, str=...) at ../V3AstNodes.cpp:1378                
#4  0x0000555555804be5 in AstRefDType::dump (this=0x5555561f4740, str=...) at ../V3AstNodes.cpp:1770
...
Whole stack

(gdb) where
#0  AstNode::privateAs (nodep=0x1) at ../V3Ast.h:108
#1  0x0000555555812d4f in AstBasicDType::rangep (this=0x555556185310) at ../V3AstNodeDType.h:396                      
#2  AstBasicDType::isRanged (this=this@entry=0x555556185310) at ../V3AstNodeDType.h:450                               
#3  0x0000555555804a56 in AstBasicDType::dump (this=0x555556185310, str=...) at ../V3AstNodes.cpp:1378                
#4  0x0000555555804be5 in AstRefDType::dump (this=0x5555561f4740, str=...) at ../V3AstNodes.cpp:1770                  
#5  0x00005555557991dc in operator<< (os=..., rhs=rhs@entry=0x5555561f4740) at ../V3Ast.h:2426                        
#6  0x00005555557acac6 in AstNode::dumpTree (this=this@entry=0x5555561f4740, os=..., indent=..., maxDepth=maxDepth@entry=-1) at ../V3Ast.cpp:1087
#7  0x00005555557acc40 in AstNode::dumpTree (this=this@entry=0x555556166ab0, os=..., indent=..., maxDepth=maxDepth@entry=0) at ../V3Ast.cpp:1097
#8  0x00005555557acdf3 in AstNode::dumpTreeGdb (nodep=0x555556166ab0) at /usr/include/c++/12.2.0/bits/new_allocator.h:80
#9  
#10 VNVisitor::iterateChildrenConst (nodep=0x555556166ab0, this=0x7fffffffdd90) at ../V3Ast.h:2486                    
#11 BrokenCheckVisitor::processAndIterate (this=0x7fffffffdd90, nodep=0x555556166ab0) at ../V3Broken.cpp:199          
#12 0x00005555558289dd in BrokenCheckVisitor::visit (this=, nodep=) at ../V3Broken.cpp:310
#13 0x00005555557ab1c8 in VNVisitor::visit (this=, nodep=) at ./V3Ast__gen_visitor_defns.h:400
#14 0x000055555580ce0a in AstTypeTable::accept (this=, v=...) at ../V3AstNodeOther.h:1489              
#15 0x00005555557ab7d0 in AstNode::iterateAndNextConst (this=, v=...) at ../V3Ast.cpp:907              
#16 0x00005555557ab871 in AstNode::iterateChildrenConst (this=this@entry=0x5555561663a0, v=...) at ../V3Ast.cpp:841   
#17 0x00005555558287f0 in VNVisitor::iterateChildrenConst (nodep=0x5555561663a0, this=0x7fffffffdd90) at ../V3Ast.h:2486
#18 BrokenCheckVisitor::processAndIterate (this=0x7fffffffdd90, nodep=0x5555561663a0) at ../V3Broken.cpp:199          
#19 0x00005555558289dd in BrokenCheckVisitor::visit (this=, nodep=) at ../V3Broken.cpp:310
#20 0x00005555557aa660 in VNVisitor::visit (this=, nodep=) at ./V3Ast__gen_visitor_defns.h:235
#21 0x000055555580ccea in AstNetlist::accept (this=, v=...) at ../V3AstNodeOther.h:1136                
#22 0x00005555558293a7 in VNVisitor::iterate (nodep=0x5555561663a0, this=0x7fffffffdd90) at ../V3Ast.h:2478           
#23 BrokenCheckVisitor::BrokenCheckVisitor (this=0x7fffffffdd90, nodep=0x5555561663a0) at ../V3Broken.cpp:315         
#24 0x000055555582631a in V3Broken::brokenAll (nodep=0x5555561663a0) at ../V3Broken.cpp:345                           
#25 0x00005555557fcde6 in AstNode::dumpTreeFile (this=0x5555561663a0, filename=..., append=append@entry=false, doDump=doDump@entry=false, doCheck=doCheck@entry=true) at ../V3Ast.cpp:1142
#26 0x00005555559e34f4 in V3Global::dumpCheckGlobalTree (stagename=..., newNumber=newNumber@entry=0, doDump=doDump@entry=false) at ../V3Global.h:131
#27 0x00005555558af977 in V3Dead::deadifyModules (nodep=) at /usr/include/c++/12.2.0/bits/new_allocator.h:80
#28 0x000055555578dfcf in process () at ../V3Global.h:131
#29 0x000055555578f1b5 in verilate (argString=...) at ../Verilator.cpp:629
#30 0x00005555557902e2 in main (argc=, argv=) at ../Verilator.cpp:751

After printing the details of BASICDTYPE at 0x*460, the gdb proceed with the nextp *740 and then goes to its child *0x555556185310. which has a child AstRange at address 0x1. So this is causing the problem. *310 is a BASICDTYPE of logic, so maybe AstRange pointer of *310 is set to a value instead of an address.

  • Does my story make sense?
  • When is headtail set to 0?

@wsnyder
Copy link
Member
wsnyder commented Jan 24, 2023

A crash in V3Dead or V3Broken often indicates an earlier transform messed something up. A pointer of 0x1 is used in an object that was earlier deleted. So the crash is really that earlier a node was deleted and a pointer still exists to it as you suspected. If you print the broken node (pn node won't work) you should see an editCount you can use to find where it was changed (hopefully), see the internals.txt for more details. Alternatively, use a gdb watchpoint to see where the 0x1 was written and backtrace.

@goekce
Copy link
Contributor Author
goekce commented Jan 24, 2023

When is headtail set to 0?

headtail is only set for the head and tail node on the same hierarchy. headtail of a head node is set to the address of the tail node and vice-versa. Middle nodes have the address 0. So nothing fishy here.

I got the last edit number of the the BASICDTYPE by using its address after the segfault.

p (struct AstNode*) 0xADDR

As you mentioned all the tree pointers are set to 0x1.

Breaking at the edit id leaves you in the middle of a tree delete operation. Probably the edit happens during V3Dead during deadCheckMod(). The BASICDTYPE logic is deleted during elimination of the IFACE intf which is the second dead module after m. After deadCheckMod() the type table is regenerated:

verilator/src/V3Dead.cpp

Lines 526 to 530 in 4a8cfe3

deadCheckMod();
// We may have removed some datatypes, cleanup
nodep->typeTablep()->repairCache();
}

(It is somehow also cleared in the beginning of V3Dead, which I do not understand: )

verilator/src/V3Dead.cpp

Lines 507 to 510 in 4a8cfe3

// Prepare to remove some datatypes
nodep->typeTablep()->clearCache();
// Operate on whole netlist
iterate(nodep);

My hunch is that during regeneration the type table picks up the wrong BASICDTYPE logic. AFAI understand the type table is regenerated using scopes.

@wsnyder
Copy link
Member
wsnyder commented Jan 25, 2023

Yes, it probably got mistracked in scope creation. Interfaces are complicated to handle correctly as they are both data types and modules.

@goekce
Copy link
Contributor Author
goekce commented Jan 25, 2023

I did not look into scope creation yet.

While I was peeking into nodep->typeTablep()->repairCache() I noticed the difference between the cache and the actual children of the type table. repairCache() only creates a cache of the children which are BASICDTYPEs. So repairCache() works fine.

I checked the children of the type table again, there are four BASICDTYPEs and one REFDTYPE (logic_t) which was pointing to the logic in the interface intf. V3Dead eliminated intf, so logic_t's type pointer is dangling. For reference I attached the node graph before V3Dead pass–you can use CTRL+Mouse-wheel to zoom after opening in the browser:

Vt_interface_parameter_function_016_linkdotparam tree dot

I believe intf should not have been removed because REFDTYPE logic_t needs the intf->logic_t->logic .

Does this make sense?

@goekce
Copy link
Contributor Author
goekce commented Jan 25, 2023

I believe intf should not have been removed because REFDTYPE logic_t needs the intf->logic_t->logic .

I noticed intf__A1 (parameterized copy of intf) already contains a copy of TYPEDEF logic_t and its child BASICDTYPE logic. So removing the intf is not the problem. logic_t in the type table should point to logic of intf__A1 instead.

Still I do not understand why V3Dead would remove a data type which is used by the type table (by removing the whole intf tree).

@goekce
Copy link
Contributor Author
goekce commented Jan 25, 2023

Still I do not understand why V3Dead would remove a data type which is used by the type table (by removing the whole intf tree).

I found the reason:

verilator/src/V3LinkDot.cpp

Lines 1562 to 1566 in 4a8cfe3

// Don't remove now, because we may have a tree of
// parameterized modules with VARXREFs into the deleted module
// region. V3Dead should cleanup.
// Downstream visitors up until V3Dead need to check for nodep->dead.
nodep->dead(true);

V3LinkDot anticipates that existing references like VARXREF could point to a dead module so it postpones the removal to V3Dead step. So V3Dead should cleanup means that it should not only repair the cache but also the children.

V3Dead uses AstTypeTable::repairCache() which iterates over the basic data types (not reference data types) and adds them to the cache:

verilator/src/V3AstNodes.cpp

Lines 1026 to 1034 in 4a8cfe3

void AstTypeTable::repairCache() {
// After we mass-change widthMin in V3WidthCommit, we need to correct the table.
clearCache();
for (AstNode* nodep = typesp(); nodep; nodep = nodep->nextp()) {
if (AstBasicDType* const bdtypep = VN_CAST(nodep, BasicDType)) {
(void)findInsertSameDType(bdtypep);
}
}
}

I think V3Dead should also include a step where reference data types are resolved to the parameterized modules.

@wsnyder
Copy link
Member
wsnyder commented Jan 26, 2023

V3Dead should get a correct tree as an input, it shouldn't have to do other resolution work, so it's presumably a problem in V3LinkDot(?)

@goekce
Copy link
Contributor Author
goekce commented Jan 27, 2023

V3Dead should get a correct tree as an input

Thanks, this helps me a lot.

I added a parametered module to the design to compare the differences between a parameterized interface and a module. There is indeed a difference: the type table picks up the right datatypes in case of the parameterized module.

The datatypes are added to the data type table via WidthVisitor::iterateEditMoveDTypep(AstNode*, AstNodeDType*) during V3Width. iterateEditMoveDTypep is called during W3Width::visit() with parameters (nodep, nodep->subtypep() ), e.g., (VAR, REFDTYPE), in other words, WidthVisitor iterates on the node, then widths the children (e.g., logic) and modifies the sub datatype of the node to the widthed datatype (logic) like this:

REFDTYPE 0x5555561f53f0 <e161> {c12al} @dt=0@  logic_t -> TYPEDEF 0x5555561f5090 <e37> {c10aq} @dt=0@  logic_t -> BASICDTYPE 0x5555561f4f30 <e21> {c10ak} @dt=this@(w1)  logic kwd=logic

Is transformed to

REFDTYPE 0x5555561f53f0 <e237#> {c12al} @dt=0x5555561f4f30@(w1)  logic_t refdt=0x5555561f4f30(w1) -> BASICDTYPE 0x5555561f4f30 <e21> {c10ak} @dt=this@(w1)  logic kwd=logic

Finally the child REFDTYPE is moved to the data type table, so the VAR does not have any children anymore. For example VAR f on the above graph is without any children due to iterateEditMoveDTypep.

Somehow this operation is only applied to intf but not to intf__A1. But in my second design (with the additional parameterized module) V3Width applies iterateEditMoveDTypep only on the parameterized module instead of the generic module. The latter operation is correct, because the generic module is removed by V3Deadify later.

I am searching for the reason why V3Width applies iterateEditMoveDTypep only on the generic interface intf instead of intf__A1.

For completeness I attach the tree image of the second design here. The parameterized module is x__K1.


interface intf #(A=0);
        typedef logic logic_t;
    function logic_t f();
            return 0;
    endfunction

    modport if_m (
            import f
    );

endinterface

module t;
intf #(1) intf1();
m m0(.*);
x #(1) x0;
endmodule

module m (intf.if_m intf1);
if (intf1.f())
$error();
endmodule

module x #(k=0);
typedef logic cilog_t;
function cilog_t cil(); // logic_t => logic ok
return 0;
endfunction

if (cil()) $error;
endmodule

@goekce
Copy link
Contributor Author
goekce commented Jan 27, 2023

I noticed that intf is on level 4 compared to other modules like m and x which are on level 3 even intf is instantiated directly under t. Probably because intf is actually used by m0:

Vt_interface_parameter_function_001_linkcells dot

I don't think this difference is related to the problem though.

@wsnyder
Copy link
Member
wsnyder commented Jan 27, 2023

What matters is the interface level > level of any modules using it. It is a rank of the graph you posted.

@goekce
Copy link
Contributor Author
goekce commented Jan 28, 2023

V3Width applies iterateEditMoveDTypep on the generic interface intf instead of intf__A1, because the function inside the generate statement if (intf1.f()) in module m__Iz1 points to the function in intf1:

FUNCREF 0x5555561fef00 <e177> {c28am} @dt=0@  f -> .=intf1 FUNC 0x5555561f5520 <e33> {c12at} @dt=0@  f

I believe intf1.f() in GENIF should be linked to to intf1__A1 instead of intf . This happens probably during V3Param.

For example the IFACEREFDTYPE in m__Iz1 is indeed linked to intf__A1 which is correct.

IFACEREFDTYPE 0x5555561fed00 <e74> {c27al} @dt=0@ if=intf mp=if_m -> IFACE 0x555556183220 <e218#> {c9al}  intf__A1 ...
8000

@goekce
Copy link
Contributor Author
goekce commented Jan 28, 2023

This happens probably during V3Param.

Actually first linking happens during V3LinkDot before the modules are deparameterized in V3Param, so all variables, functions etc get linked to intf:

    1:2:1: IFACEREFDTYPE 0x5555561f7e50 <e74> {c27al} @dt=0@ if=intf mp=if_m -> IFACE 0x5555561f4980 <e158> {c9al} u1=0x5555561fca80 u4=0x1  intf  L4 [LIB] [1ps]

During V3Param intf is cloned, deparameterized and the result is intf__A1. The intf1 cells point now to intf__A1.

- V3Param.cpp:1311:   param:                                                                                          
- V3Param.cpp:865:    De-parameterize: CELL 0x5555561f67c0 <e49> {c22am}  intf1 -> IFACE 0x5555561f4980 <e158> {c9al}  intf  L4 [LIB] [1ps]
...         
- V3Width.cpp:7194:   widthParamsEdit: CONST 0x5555561f69e0 <e47> {c22aj} @dt=0x5555561f4b90@(G/swu32/1)  ?32?sh1                                                                                                                            
- V3Param.cpp:373:    Name: intf->intf__A1->intf__A1                                                                  
- V3Param.cpp:593:         De-parameterize to new: IFACE 0x555556183220 <e218#> {c9al}  intf__A1  L4 [LIB] [1ps]                                                                                                                             
- V3Param.cpp:626:           set param VAR 0x5555561fdb30 <e15> {c9as} u4=0x41 @dt=0@  A [VSTATIC]  GPARAM = CONST 0x5555561f69e0 <e47> {c22aj} @dt=0x5555561f4b90@(G/swu32/1)  ?32?sh1
- V3Param.cpp:817:         Done with IFACE 0x555556183220 <e218#> {c9al}  intf__A1  L4 [LIB] [1ps]
- V3Param.cpp:882:         Done with CELL 0x5555561f67c0 <e49> {c22am}  intf1 -> IFACE 0x555556183220 <e218#> {c9al}  intf__A1  L4 [LIB] [1ps]

Then IFACEREFDTYPEs of m0 must be reconnected, and I could not understand why. I thought the step above would make all the intf1 cells point to intf__A1 😕 :

- V3Width.cpp:7194:   widthParamsEdit: CELL 0x5555561f6d60 <e55> {c23ae}  m0 -> MODULE 0x5555561f77f0 <e156> {c27ai}  m  L3 [1ps]
- V3Param.cpp:750:         portIfaceRef IFACEREFDTYPE 0x5555561f7e50 <e74> {c27al} @dt=0@ if=intf mp=if_m -> IFACE 0x5555561f4980 <e158> {c9al}  intf  L4 [LIB] [1ps]
- V3Param.cpp:760:         pinIfaceRef IFACEREFDTYPE 0x5555561fb0b0 <e142> {c22am} @dt=0@ cell=intf1 if=intf -> CELL 0x5555561f67c0 <e49> {c22am}  intf1 -> IFACE 0x555556183220 <e218#> {c9al}  intf__A1  L4 [LIB] [1ps]
- V3Param.cpp:762:         IfaceRefDType needs reconnect  IFACEREFDTYPE 0x5555561fb0b0 <e142> {c22am} @dt=0@ cell=intf1 if=intf -> CELL 0x5555561f67c0 <e49> {c22am}  intf1 -> IFACE 0x555556183220 <e218#> {c9al}  intf__A1  L4 [LIB] [1ps]
- V3Param.cpp:373:    Name: m->m__Iz1->m__Iz1
- V3Param.cpp:593:         De-parameterize to new: MODULE 0x5555561fea50 <e227#> {c27ai}  m__Iz1  L3 [1ps]
- V3Param.cpp:606:         IfaceOld IFACEREFDTYPE 0x5555561f7e50 <e74> {c27al} @dt=0@ if=intf mp=if_m -> IFACE 0x5555561f4980 <e158> {c9al}  intf  L4 [LIB] [1ps]
- V3Param.cpp:607:         IfaceTo  IFACEREFDTYPE 0x5555561fb0b0 <e142> {c22am} @dt=0@ cell=intf1 if=intf -> CELL 0x5555561f67c0 <e49> {c22am}  intf1 -> IFACE 0x555556183220 <e218#> {c9al}  intf__A1  L4 [LIB] [1ps]
- V3Param.cpp:609:         IfaceClo IFACEREFDTYPE 0x5555561fed00 <e74> {c27al} @dt=0@ if=intf mp=if_m -> IFACE 0x5555561f4980 <e158> {c9al}  intf  L4 [LIB] [1ps]
- V3Param.cpp:611:         IfaceNew IFACEREFDTYPE 0x5555561fed00 <e74> {c27al} @dt=0@ if=intf mp=if_m -> IFACE 0x555556183220 <e218#> {c9al}  intf__A1  L4 [LIB] [1ps]

I see that IFACEREFDTYPEs and CELLs are updated. Maybe the reconnect operation forgets to relink intf1.f() in GENIF, because it is neither a cell or somehow related to a IFACEREFDTYPE.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area: elaboration Issue involves elaboration phase status: ready Issue is ready for someone to fix; then goes to 'status: assigned'
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants
0