The-OpenROAD-Project / OpenROAD

OpenROAD's unified application implementing an RTL-to-GDS Flow. Documentation at https://openroad.readthedocs.io/en/latest/
https://theopenroadproject.org/
BSD 3-Clause "New" or "Revised" License
1.53k stars 536 forks source link

rtl_macro_placer crashes when only lef/def are read #5285

Closed stefanottili closed 2 months ago

stefanottili commented 3 months ago

Describe the bug

rtl_macro_placer coredumps after only reading lef/def.

see https://github.com/The-OpenROAD-Project/OpenROAD/issues/5284 for the input data.

I did replace CLASS RING with CLASS BLOCK to get macro_placement to work, I'm assuming rtl_macro_placer will need this too.

Expected Behavior

no coredump

Environment

M1 MacOS
OpenROAD v2.0-14310-g69872cd76 
Features included (+) or not (-): +Charts +GPU +GUI +Python

To Reproduce

openroad -gui -threads max risc2.or

read_lef lef/risc2.lef.gz
read_def def/risc2.def.gz
rtl_macro_placer

Relevant log output

[INFO ODB-0227] LEF file: lef/risc2.lef.gz, created 13 layers, 16 vias, 147 library cells
[INFO ODB-0127] Reading DEF file: def/risc2.def.gz
[INFO ODB-0128] Design: frisc
[INFO ODB-0130]     Created 629 pins.
[INFO ODB-0131]     Created 32622 components and 196041 component-terminals.
[INFO ODB-0132]     Created 2 special nets and 65244 connections.
[INFO ODB-0133]     Created 34034 nets and 128506 connections.
[INFO ODB-0134] Finished DEF file: def/risc2.def.gz
Floorplan Outline: (-479.6, -479.6) (480, 480),  Core Outline: (-479.6, -478.4) (480, 479.2)
Traversed logical hierarchy
    Number of std cell instances: 32615
    Area of std cell instances: 521777.56
    Number of macros: 7
    Area of macros: 349004.25
    Area of macros with halos: 349004.25
    Area of std cell instances + Area of macros: 870781.81
    Core area: 918912.94
    Design Utilization: 0.95
    Core Utilization: 0.92
    Manufacturing Grid: 10

Signal 11 received
Stack trace:
 0# handler(int) in OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad
 1# _sigtramp in /usr/lib/system/libsystem_platform.dylib
 2# mpl2::HierRTLMP::createDataFlow() in OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad
 3# mpl2::HierRTLMP::createDataFlow() in OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad
 4# mpl2::HierRTLMP::runMultilevelAutoclustering() in OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad
 5# mpl2::HierRTLMP::run() in OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad
 6# mpl2::MacroPlacer2::place(int, int, int, int, int, float, int, float, int, int, int, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, int, bool, char const*) in OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad
 7# mpl2::rtl_macro_placer_cmd(int, int, int, int, float, int, float, int, int, int, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, float, int, bool, char const*) in OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad
 8# _wrap_rtl_macro_placer_cmd(void*, Tcl_Interp*, int, Tcl_Obj* const*) in OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad
 9# TclNRRunCallbacks in /opt/homebrew/Cellar/tcl-tk/8.6.14/lib/libtcl8.6.dylib
10# TclEvalEx in /opt/homebrew/Cellar/tcl-tk/8.6.14/lib/libtcl8.6.dylib
11# Tcl_Eval in /opt/homebrew/Cellar/tcl-tk/8.6.14/lib/libtcl8.6.dylib
12# gui::TclCmdInputWidget::executeCommand(QString const&, bool, bool) in OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad
13# gui::startGui(int&, char**, Tcl_Interp*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, bool) in OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad
14# ord::tclAppInit(Tcl_Interp*) in OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad
15# Tcl_MainEx in /opt/homebrew/Cellar/tcl-tk/8.6.14/lib/libtcl8.6.dylib
16# TclInitNamespaceSubsystem in /opt/homebrew/Cellar/tcl-tk/8.6.14/lib/libtcl8.6.dylib
17# main in OpenROAD-flow-scripts/tools/install/OpenROAD/bin/openroad

Screenshots

No response

Additional Context

No response

AcKoucher commented 3 months ago

The input data still has the macros marked as RING. Could you provide the test case with the exact configuration that lead you to the crash?

stefanottili commented 3 months ago

gunzip -c RISC2/lef/risc2.lef.gz | grep -in BLOCK

15531:  CLASS BLOCK ;
19167:  CLASS BLOCK ;
21165:  CLASS BLOCK ;

I also commented out the VIARULES for TURN via that only have one layer of metal.

  387 #VIARULE TURNmetal1 GENERATE
  388 #    LAYER metal1 ;
  389 #        DIRECTION vertical ;
  390 #   
  391 #    LAYER metal1 ; 
  392 #        DIRECTION horizontal ;
  393 #END TURNmetal1
...
  432 #        DIRECTION horizontal ;
  433 #END TURNM6

'make' will coredump immediately.

run:
        openroad -gui -threads max -log log risc2.or

RISC2.tgz