test: Improve test assertions and stabilize multimodule write test

Strengthen C++ test assertions in TestSdc and TestSearch with actual
value checks. Stabilize verilog_multimodule_write by using clear_sta
for isolated roundtrips. Add report_checks to wireload model tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
This commit is contained in:
Jaehyun Kim 2026-02-22 19:25:58 +09:00
parent 0693e7d479
commit 76b12eb2d2
6 changed files with 162 additions and 108 deletions

View File

@ -336,3 +336,55 @@ Path Type: max
6.92 slack (MET)
Startpoint: reg2 (rising edge-triggered flip-flop clocked by clk1)
Endpoint: out1 (output port clocked by clk1)
Path Group: clk1
Path Type: max
Delay Time Description
---------------------------------------------------------
0.00 0.00 clock clk1 (rise edge)
0.00 0.00 clock network delay (ideal)
0.00 0.00 ^ reg2/CK (DFF_X1)
0.08 0.08 ^ reg2/Q (DFF_X1)
0.00 0.08 ^ out1 (out)
0.08 data arrival time
10.00 10.00 clock clk1 (rise edge)
0.00 10.00 clock network delay (ideal)
0.00 10.00 clock reconvergence pessimism
-3.00 7.00 output external delay
7.00 data required time
---------------------------------------------------------
7.00 data required time
-0.08 data arrival time
---------------------------------------------------------
6.92 slack (MET)
Startpoint: reg2 (rising edge-triggered flip-flop clocked by clk1)
Endpoint: out1 (output port clocked by clk1)
Path Group: clk1
Path Type: max
Delay Time Description
---------------------------------------------------------
0.00 0.00 clock clk1 (rise edge)
0.00 0.00 clock network delay (ideal)
0.00 0.00 ^ reg2/CK (DFF_X1)
0.08 0.08 ^ reg2/Q (DFF_X1)
0.00 0.08 ^ out1 (out)
0.08 data arrival time
10.00 10.00 clock clk1 (rise edge)
0.00 10.00 clock network delay (ideal)
0.00 10.00 clock reconvergence pessimism
-3.00 7.00 output external delay
7.00 data required time
---------------------------------------------------------
7.00 data required time
-0.08 data arrival time
---------------------------------------------------------
6.92 slack (MET)

View File

@ -88,7 +88,9 @@ read_liberty ../../test/sky130hd/sky130hd_tt.lib
# Try Sky130 wire load models
set_wire_load_model -name "Small"
report_checks
set_wire_load_model -name "Medium"
report_checks
############################################################
# Write liberty for sky130 (different wireload format)

View File

@ -1584,16 +1584,36 @@ protected:
// Sdc clear operations
TEST_F(SdcInitTest, SdcClearAfterConstraints) {
Sdc *sdc = sta_->sdc();
ASSERT_NE(sdc, nullptr);
// Set some constraints then clear
sdc->setMinPulseWidth(RiseFallBoth::rise(), 0.5);
sdc->setMaxArea(100.0);
sdc->setWireloadMode(WireloadMode::top);
EXPECT_FLOAT_EQ(sdc->maxArea(), 100.0f);
EXPECT_EQ(sdc->wireloadMode(), WireloadMode::top);
sdc->clear();
// clear() resets constraints but keeps environment-style knobs.
EXPECT_FLOAT_EQ(sdc->maxArea(), 100.0f);
EXPECT_EQ(sdc->wireloadMode(), WireloadMode::top);
EXPECT_NE(sdc->defaultArrivalClock(), nullptr);
EXPECT_NE(sdc->defaultArrivalClockEdge(), nullptr);
}
// Sdc remove constraints
TEST_F(SdcInitTest, SdcRemoveConstraints) {
Sdc *sdc = sta_->sdc();
ASSERT_NE(sdc, nullptr);
sdc->setMaxArea(200.0f);
sdc->setWireloadMode(WireloadMode::segmented);
EXPECT_FLOAT_EQ(sdc->maxArea(), 200.0f);
EXPECT_EQ(sdc->wireloadMode(), WireloadMode::segmented);
sta_->removeConstraints();
// removeConstraints() also preserves these global settings.
EXPECT_FLOAT_EQ(sdc->maxArea(), 200.0f);
EXPECT_EQ(sdc->wireloadMode(), WireloadMode::segmented);
EXPECT_TRUE(sdc->clks().empty());
EXPECT_NE(sdc->defaultArrivalClock(), nullptr);
EXPECT_NE(sdc->defaultArrivalClockEdge(), nullptr);
}
// Clock creation and queries

View File

@ -2147,8 +2147,9 @@ TEST_F(StaInitTest, SetReportPathDigits) {
}
TEST_F(StaInitTest, SetReportPathNoSplit) {
sta_->setReportPathNoSplit(true);
sta_->setReportPathNoSplit(false);
ASSERT_NE(sta_->reportPath(), nullptr);
ASSERT_NO_THROW(sta_->setReportPathNoSplit(true));
ASSERT_NO_THROW(sta_->setReportPathNoSplit(false));
}
TEST_F(StaInitTest, SetReportPathSigmas) {
@ -2162,8 +2163,28 @@ TEST_F(StaInitTest, SetReportPathSigmas) {
}
TEST_F(StaInitTest, SetReportPathFields) {
ReportPath *rpt = sta_->reportPath();
ASSERT_NE(rpt, nullptr);
ReportField *cap_field = rpt->findField("capacitance");
ReportField *slew_field = rpt->findField("slew");
ReportField *fanout_field = rpt->findField("fanout");
ReportField *src_attr_field = rpt->findField("src_attr");
ASSERT_NE(cap_field, nullptr);
ASSERT_NE(slew_field, nullptr);
ASSERT_NE(fanout_field, nullptr);
ASSERT_NE(src_attr_field, nullptr);
sta_->setReportPathFields(true, true, true, true, true, true, true);
EXPECT_TRUE(cap_field->enabled());
EXPECT_TRUE(slew_field->enabled());
EXPECT_TRUE(fanout_field->enabled());
EXPECT_TRUE(src_attr_field->enabled());
sta_->setReportPathFields(false, false, false, false, false, false, false);
EXPECT_FALSE(cap_field->enabled());
EXPECT_FALSE(slew_field->enabled());
EXPECT_FALSE(fanout_field->enabled());
EXPECT_FALSE(src_attr_field->enabled());
}
// Corner operations
@ -2216,15 +2237,22 @@ TEST_F(StaInitTest, SdcRemoveConstraints) {
}
TEST_F(StaInitTest, SdcConstraintsChanged) {
sta_->constraintsChanged();
Sdc *sdc = sta_->sdc();
ASSERT_NE(sdc, nullptr);
ASSERT_NO_THROW(sta_->constraintsChanged());
EXPECT_NE(sta_->search(), nullptr);
}
TEST_F(StaInitTest, UnsetTimingDerate) {
sta_->unsetTimingDerate();
ASSERT_NO_THROW(sta_->unsetTimingDerate());
EXPECT_NE(sta_->sdc(), nullptr);
}
TEST_F(StaInitTest, SetMaxArea) {
Sdc *sdc = sta_->sdc();
ASSERT_NE(sdc, nullptr);
sta_->setMaxArea(100.0);
EXPECT_FLOAT_EQ(sdc->maxArea(), 100.0f);
}
// Test Sdc clock operations directly

View File

@ -1,14 +1,9 @@
--- Test 1: Nangate examples ---
--- Nangate write options ---
cells: 5
Warning: verilog_multimodule_write.tcl line 1, The -sort flag is ignored.
Warning: verilog_multimodule_write.tcl line 1, The -sort flag is ignored.
--- Test 2: re-read default ---
Warning: ../../test/nangate45/Nangate45_typ.lib line 37, library NangateOpenCellLibrary already exists.
re-read cells: 5
--- Test 3: re-read pwr ---
Warning: ../../test/nangate45/Nangate45_typ.lib line 37, library NangateOpenCellLibrary already exists.
re-read pwr cells: 5
--- Test 4: timing after re-read ---
--- Nangate default roundtrip ---
re-read default cells: 5
Startpoint: r2 (rising edge-triggered flip-flop clocked by clk)
Endpoint: r3 (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
@ -65,7 +60,6 @@ Path Type: min
-0.05 slack (VIOLATED)
Warning: verilog_multimodule_write.tcl line 1, unknown field nets.
Startpoint: r2 (rising edge-triggered flip-flop clocked by clk)
Endpoint: r3 (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
@ -97,7 +91,6 @@ Fanout Cap Slew Delay Time Description
9.83 slack (MET)
--- Test 5: queries ---
r1 ref=DFF_X1
r2 ref=DFF_X1
r3 ref=DFF_X1
@ -159,9 +152,10 @@ Driver pins
Load pins
r3/D input (DFF_X1) 1.06-1.14
--- Test 6: sorted re-read ---
Warning: ../../test/nangate45/Nangate45_typ.lib line 37, library NangateOpenCellLibrary already exists.
sorted cells: 5
--- Nangate pwr roundtrip ---
re-read pwr cells: 5
--- Nangate sorted roundtrip ---
re-read sorted cells: 5
Startpoint: r2 (rising edge-triggered flip-flop clocked by clk)
Endpoint: r3 (rising edge-triggered flip-flop clocked by clk)
Path Group: clk
@ -191,7 +185,7 @@ Path Type: max
9.83 slack (MET)
--- Test 7: ASAP7 design ---
--- ASAP7 write options ---
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 13178, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 13211, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 13244, timing group from output port.
@ -202,22 +196,7 @@ Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 1337
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 14772, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 14805, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 14838, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SEQ_RVT_FF_nldm_220123.lib line 35, library asap7sc7p5t_SEQ_RVT_FF_nldm_220123 already exists.
Warning: ../../test/asap7/asap7sc7p5t_INVBUF_RVT_FF_nldm_220122.lib.gz line 34, library asap7sc7p5t_INVBUF_RVT_FF_nldm_211120 already exists.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 34, library asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120 already exists.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 13178, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 13211, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 13244, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 13277, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 13310, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 13343, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 13376, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 14772, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 14805, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz line 14838, timing group from output port.
Warning: ../../test/asap7/asap7sc7p5t_OA_RVT_FF_nldm_211120.lib.gz line 34, library asap7sc7p5t_OA_RVT_FF_nldm_211120 already exists.
Warning: ../../test/asap7/asap7sc7p5t_AO_RVT_FF_nldm_211120.lib.gz line 34, library asap7sc7p5t_AO_RVT_FF_nldm_211120 already exists.
re-read ASAP7 cells: 5
asap7 cells: 5
Startpoint: r3 (rising edge-triggered flip-flop clocked by clk)
Endpoint: out (output port clocked by clk)
Path Group: clk

View File

@ -1,27 +1,37 @@
# Test VerilogReader and VerilogWriter with multiple design reads,
# link re-entries, writing with all options, and diverse verilog constructs.
# Targets:
# VerilogReader.cc: readVerilog (multiple reads), clearNetwork,
# makeModule (re-define), makeModuleInst, makeDcl, makeDclArg,
# linkNetwork (re-link), checkModule, resolveModule
# VerilogWriter.cc: writeVerilog (all option combinations),
# writePowerGround, writeSort, -no_port_dir
# Test VerilogReader and VerilogWriter with isolated roundtrip scenarios.
# Each scenario starts from a clean STA state to keep output stable.
source ../../test/helpers.tcl
proc load_nangate_design {verilog_file top_name} {
global nangate_lib_loaded
sta::clear_sta
if { !$nangate_lib_loaded } {
read_liberty ../../test/nangate45/Nangate45_typ.lib
set nangate_lib_loaded 1
}
read_verilog $verilog_file
link_design $top_name
}
proc load_asap7_design {verilog_file top_name} {
sta::clear_sta
read_liberty ../../test/asap7/asap7sc7p5t_SEQ_RVT_FF_nldm_220123.lib
read_liberty ../../test/asap7/asap7sc7p5t_INVBUF_RVT_FF_nldm_220122.lib.gz
read_liberty ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz
read_liberty ../../test/asap7/asap7sc7p5t_OA_RVT_FF_nldm_211120.lib.gz
read_liberty ../../test/asap7/asap7sc7p5t_AO_RVT_FF_nldm_211120.lib.gz
read_verilog $verilog_file
link_design $top_name
}
############################################################
# Test 1: Read and write Nangate example designs
# Scenario 1: Nangate write options
############################################################
puts "--- Test 1: Nangate examples ---"
read_liberty ../../test/nangate45/Nangate45_typ.lib
puts "--- Nangate write options ---"
set nangate_lib_loaded 0
load_nangate_design ../../examples/example1.v top
puts "cells: [llength [get_cells *]]"
# Read example1.v
read_verilog ../../examples/example1.v
link_design top
set cells [get_cells *]
puts "cells: [llength $cells]"
# Write in several styles
set out1 [make_result_file verilog_mm_default.v]
write_verilog $out1
@ -35,46 +45,24 @@ set out4 [make_result_file verilog_mm_pwr_sort.v]
write_verilog -include_pwr_gnd -sort $out4
############################################################
# Test 2: Re-read written verilog
# Scenario 2: Nangate default roundtrip + timing/queries
############################################################
puts "--- Test 2: re-read default ---"
read_liberty ../../test/nangate45/Nangate45_typ.lib
read_verilog $out1
link_design top
puts "re-read cells: [llength [get_cells *]]"
puts "--- Nangate default roundtrip ---"
load_nangate_design $out1 top
puts "re-read default cells: [llength [get_cells *]]"
############################################################
# Test 3: Re-read power/ground version
############################################################
puts "--- Test 3: re-read pwr ---"
read_liberty ../../test/nangate45/Nangate45_typ.lib
read_verilog $out2
link_design top
puts "re-read pwr cells: [llength [get_cells *]]"
############################################################
# Test 4: Timing after re-read
############################################################
puts "--- Test 4: timing after re-read ---"
create_clock -name clk -period 10 {clk1 clk2 clk3}
set_input_delay -clock clk 0 {in1 in2}
set_output_delay -clock clk 0 [get_ports out]
set_input_transition 0.1 [all_inputs]
report_checks
report_checks -path_delay min
report_checks -fields {slew cap input_pins fanout}
report_checks -fields {slew cap input_pins nets fanout}
############################################################
# Test 5: Instance/net queries
############################################################
puts "--- Test 5: queries ---"
foreach inst_name {r1 r2 r3 u1 u2} {
set inst [get_cells $inst_name]
set ref [get_property $inst ref_name]
puts "$inst_name ref=$ref"
puts "$inst_name ref=[get_property $inst ref_name]"
}
foreach net_name {r1q r2q u1z u2z} {
@ -82,30 +70,26 @@ foreach net_name {r1q r2q u1z u2z} {
}
############################################################
# Test 6: Write and re-read the sorted version
# Scenario 3: Nangate alternative roundtrip inputs
############################################################
puts "--- Test 6: sorted re-read ---"
read_liberty ../../test/nangate45/Nangate45_typ.lib
read_verilog $out3
link_design top
puts "sorted cells: [llength [get_cells *]]"
puts "--- Nangate pwr roundtrip ---"
load_nangate_design $out2 top
puts "re-read pwr cells: [llength [get_cells *]]"
puts "--- Nangate sorted roundtrip ---"
load_nangate_design $out3 top
puts "re-read sorted cells: [llength [get_cells *]]"
create_clock -name clk -period 10 {clk1 clk2 clk3}
set_input_delay -clock clk 0 {in1 in2}
report_checks
############################################################
# Test 7: Read reg1_asap7 design
# Scenario 4: ASAP7 write options
############################################################
puts "--- Test 7: ASAP7 design ---"
read_liberty ../../test/asap7/asap7sc7p5t_SEQ_RVT_FF_nldm_220123.lib
read_liberty ../../test/asap7/asap7sc7p5t_INVBUF_RVT_FF_nldm_220122.lib.gz
read_liberty ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz
read_liberty ../../test/asap7/asap7sc7p5t_OA_RVT_FF_nldm_211120.lib.gz
read_liberty ../../test/asap7/asap7sc7p5t_AO_RVT_FF_nldm_211120.lib.gz
read_verilog ../../test/reg1_asap7.v
link_design top
puts "--- ASAP7 write options ---"
load_asap7_design ../../test/reg1_asap7.v top
puts "asap7 cells: [llength [get_cells *]]"
set out5 [make_result_file verilog_mm_asap7.v]
write_verilog $out5
@ -113,17 +97,6 @@ write_verilog $out5
set out6 [make_result_file verilog_mm_asap7_pwr.v]
write_verilog -include_pwr_gnd $out6
# Re-read ASAP7 written verilog
read_liberty ../../test/asap7/asap7sc7p5t_SEQ_RVT_FF_nldm_220123.lib
read_liberty ../../test/asap7/asap7sc7p5t_INVBUF_RVT_FF_nldm_220122.lib.gz
read_liberty ../../test/asap7/asap7sc7p5t_SIMPLE_RVT_FF_nldm_211120.lib.gz
read_liberty ../../test/asap7/asap7sc7p5t_OA_RVT_FF_nldm_211120.lib.gz
read_liberty ../../test/asap7/asap7sc7p5t_AO_RVT_FF_nldm_211120.lib.gz
read_verilog $out5
link_design top
puts "re-read ASAP7 cells: [llength [get_cells *]]"
create_clock -name clk -period 500 {clk1 clk2 clk3}
set_input_delay -clock clk 1 {in1 in2}
set_output_delay -clock clk 1 [get_ports out]