diff --git a/BUG_REPORTS.md b/BUG_REPORTS.md deleted file mode 100644 index 06057a28..00000000 --- a/BUG_REPORTS.md +++ /dev/null @@ -1,136 +0,0 @@ -# Bug Reports - Upstream STA Update - -These bugs were found during test adaptation after the massive upstream STA update -(Corner→Scene, Mode architecture, etc.). Source code was NOT modified per policy; -only test files were edited. These bugs exist in the upstream source code. - ---- - -## Bug 1: `report_clock_skew -clocks` broken - undefined variable `$clks` - -**File:** `search/Search.tcl`, line 272 -**Severity:** High - command completely broken -**Symptom:** `report_clock_skew -clock ` fails with Tcl error - -**Description:** -The `report_clock_skew` proc has a debug `puts` statement where the variable -assignment should be. When the `-clocks` key is provided, `$clks` is never set, -causing the command to fail. - -**Expected code (approximately):** -```tcl -set clks $keys(-clocks) -``` - -**Actual code:** -```tcl -puts "clocks $keys(-clocks)" ;# debug print left in by mistake -``` - -**Impact:** Any use of `report_clock_skew` with `-clock`/`-clocks` argument will fail. - ---- - -## Bug 2: `startpointPins()` declared but never implemented - -**File:** `include/sta/Sta.hh` (declaration), no `.cc` implementation -**Severity:** Medium - linker error if called -**Symptom:** Symbol not found at link time - -**Description:** -`Sta::startpointPins()` is declared in the header but has no implementation in -any `.cc` file. The old `Search::visitStartpoints(VertexPinCollector*)` was also -removed. There is no replacement API for enumerating timing startpoints. - -**Impact:** Cannot enumerate startpoint pins programmatically. - ---- - -## Bug 3: `CcsCeffDelayCalc::reportGateDelay` use-after-free - -**File:** `dcalc/CcsCeffDelayCalc.cc`, line ~679 -**Severity:** High - potential crash or wrong results -**Symptom:** SEGFAULT or corrupted data when calling `reportDelayCalc` after `updateTiming` - -**Description:** -`CcsCeffDelayCalc::reportGateDelay` accesses the member variable `parasitics_` -which was set during a previous `gateDelay()` call (invoked by `updateTiming`). -After timing update completes, the parasitics pointer can become stale (freed -and reallocated for other objects). GDB inspection showed `parasitics_` pointing -to a `LibertyPort` vtable instead of `ConcreteParasitics`. - -Other delay calculators (e.g., `DmpCeffDelayCalc::reportGateDelay`) refresh -their parasitics reference by calling `scene->parasitics(min_max)` inline. -`CcsCeffDelayCalc` should do the same. - -**Suggested fix:** -In `CcsCeffDelayCalc::reportGateDelay`, fetch fresh parasitics via -`scene->parasitics(min_max)` instead of relying on the stale `parasitics_` member. - ---- - -## Bug 4: `reduceToPiElmore()`/`reduceToPiPoleResidue2()` null Scene dereference - -**File:** `parasitics/ReduceParasitics.cc` -**Severity:** Medium - crash when Scene is null -**Symptom:** SEGFAULT when calling reduce functions without a valid Scene - -**Description:** -Both `reduceToPiElmore()` and `reduceToPiPoleResidue2()` unconditionally -dereference the `scene` parameter at `scene->parasitics(min_max)` without -checking for null. While callers should always pass a valid Scene, the lack -of a null check makes debugging difficult when called incorrectly. - -**Suggested fix:** -Add a null check for `scene` parameter, or at minimum add an assertion: -```cpp -assert(scene != nullptr); // or sta_assert -``` - ---- - -## Bug 5: SWIG interface gaps - functions removed without replacements - -**Severity:** Low-Medium -**Symptom:** Tcl commands no longer available - -The following functions were removed from the SWIG `.i` interface files without -providing equivalent replacements accessible from Tcl: - -| Removed Function | Was In | Notes | -|---|---|---| -| `sta::startpoints` | Search.i | No replacement; `startpointPins()` declared but not implemented | -| `sta::is_ideal_clock` | Search.i | No replacement found | -| `sta::min_period_violations` | Search.i | No replacement; `report_check_types` only prints | -| `sta::min_period_check_slack` | Search.i | No replacement | -| `sta::min_pulse_width_violations` | Search.i | No replacement | -| `sta::min_pulse_width_check_slack` | Search.i | No replacement | -| `sta::max_skew_violations` | Search.i | No replacement | -| `sta::max_skew_check_slack` | Search.i | No replacement | -| `sta::check_slew_limits` | Search.i | No replacement | -| `sta::check_fanout_limits` | Search.i | No replacement | -| `sta::check_capacitance_limits` | Search.i | No replacement | -| `sta::remove_constraints` | Sdc.i | No replacement | -| `sta::pin_is_constrained` | Sdc.i | No replacement | -| `sta::instance_is_constrained` | Sdc.i | No replacement | -| `sta::net_is_constrained` | Sdc.i | No replacement | -| `Vertex::is_clock` | Graph.i | No replacement | -| `Vertex::has_downstream_clk_pin` | Graph.i | No replacement | -| `Edge::is_disabled_bidirect_net_path` | Graph.i | No replacement | - -**Impact:** Scripts using these functions will fail. The check/violation counting -functions are particularly important for timing signoff scripts that need -programmatic access to violation counts (not just printed reports). - ---- - -## Bug 6: `max_fanout_violation_count` / `max_capacitance_violation_count` crash - -**Severity:** Medium - crash on valid input -**Symptom:** SEGFAULT (exit code 139) when calling without limit constraints set - -**Description:** -Calling `max_fanout_violation_count` or `max_capacitance_violation_count` when -no corresponding limit constraints have been set results in a segmentation fault -instead of returning 0 or an error message. These functions should handle the -case where no limits are defined gracefully. diff --git a/IMPL_PLAN.md b/IMPL_PLAN.md deleted file mode 100644 index 591fd3eb..00000000 --- a/IMPL_PLAN.md +++ /dev/null @@ -1,269 +0,0 @@ -# Test Quality Improvement — Implementation Plan (Revised) - -## Status Summary - -| Comment | Issue | Status | -|---------|-------|--------| -| 1 | verilog_write_types.tcl quality | **Done** | -| 2 | Tcl→C++ conversion (dcalc, others) | **Done** | -| 3 | Unnecessary catch blocks | **Done** — removed where safe, kept where commands genuinely fail | -| 4 | "puts PASS" anti-pattern | **Done** | -| 5 | Incremental timing tests | **Done** — TestSearchIncremental.cc expanded: 8→36 tests | -| 6 | liberty_wireload.tcl missing report_checks | **Done** — report_checks after each set_wire_load_model | -| 7 | liberty_ccsn_ecsm.tcl misnaming | **Done** — renamed to liberty_ccsn.tcl | -| 8 | liberty_sky130_corners.tcl not testing corners | **Done** — define_corners + read_liberty -corner, actual multi-corner timing | -| 9 | Orphaned sdc_disable_case.ok | **Done** | -| 10 | C++ tests too short | **Done** — TestPower: 71→96, TestSpice: 98→126, TestSearchIncremental: 8→36 | -| 11 | Remove PASS prints | **Done** (same as Comment 4) | -| 12 | `test/ $ ./regression -R verilog_specify` broken | **Done** — special case for test/ directory | -| 13 | search/test/CMakeLists.txt messy | **Done** — sta_module_tests() function, all 12 modules refactored | - ---- - -## Remaining Tasks - -### Task 1: Remove remaining catch blocks (Comment 3) - -**Problem:** 176 `catch` blocks remain in 30 Tcl test files, silently swallowing errors. - -**Affected files (30):** - -| Module | Files | Count | -|--------|-------|-------| -| search | 16 files | 84 | -| sdc | 6 files | 39 | -| liberty | 8 files | 35 | -| verilog | 4 files | 4 | - -**Action for each file:** -1. Remove `catch {}` wrappers around commands that should succeed — keep the command bare -2. Keep `catch` only when **intentionally testing an error condition** (e.g., `if {[catch {...} msg]} { ... }`) -3. Regenerate `.ok` files by running the test - -**Note:** Some catch blocks may have been left intentionally (e.g., `liberty_ccsn_ecsm.tcl` wrapping `report_lib_cell` calls that may fail on missing cells). Review each case carefully. - ---- - -### Task 2: Fix verilog test quality issues (Comment 1) - -**Problems remaining:** -1. Stale line-number comments in headers (e.g., `# writeInstBusPin (line 382, hit=0)`) -2. Useless `if { [file exists $out] && [file size $out] > 0 }` checks — 16 files -3. `verilog_write_types.tcl` is monolithic (174 lines, no .ok file) - -**Affected files:** -- `verilog_write_types.tcl`, `verilog_assign.tcl`, `verilog_complex_bus.tcl`, `verilog_const_concat.tcl` — stale line# comments -- 15 verilog + 1 sdf test files — empty file-existence checks - -**Action:** -1. Remove all `# Targets: ... (line NNN, hit=N)` comment blocks from headers -2. Remove the useless `if { [file exists ...] && [file size ...] > 0 } { }` blocks entirely (the `.ok` diff already validates output) -3. Either delete `verilog_write_types.tcl` (its .ok is already gone) or regenerate its .ok -4. Regenerate affected `.ok` files - ---- - -### Task 3: Clean up dcalc Tcl tests (Comment 2) - -**Problem:** 21 dcalc Tcl test files remain but ALL their `.ok` files were deleted. These Tcl tests are now effectively dead (cannot be regression-tested). New C++ tests have been added in `TestDcalc.cc` and `TestFindRoot.cc`. - -**Action:** -1. Verify the new C++ tests cover what the Tcl tests covered -2. Delete the 21 orphaned Tcl files -3. Remove their entries from `dcalc/test/CMakeLists.txt` - -**Files to delete:** -``` -dcalc/test/dcalc_advanced.tcl dcalc/test/dcalc_multi_engine_spef.tcl -dcalc/test/dcalc_annotate_slew.tcl dcalc/test/dcalc_prima.tcl -dcalc/test/dcalc_annotated_incremental.tcl dcalc/test/dcalc_prima_arnoldi_deep.tcl -dcalc/test/dcalc_arnoldi_prima.tcl dcalc/test/dcalc_report.tcl -dcalc/test/dcalc_arnoldi_spef.tcl dcalc/test/dcalc_spef.tcl -dcalc/test/dcalc_ccs_incremental.tcl -dcalc/test/dcalc_ccs_parasitics.tcl -dcalc/test/dcalc_corners.tcl -dcalc/test/dcalc_dmp_ceff.tcl -dcalc/test/dcalc_dmp_convergence.tcl -dcalc/test/dcalc_dmp_edge_cases.tcl -dcalc/test/dcalc_dmp_pi_model_deep.tcl -dcalc/test/dcalc_engines.tcl -dcalc/test/dcalc_gcd_arnoldi_prima.tcl -dcalc/test/dcalc_graph_delay.tcl -dcalc/test/dcalc_incremental_tolerance.tcl -``` - ---- - -### Task 4: Fix liberty_wireload.tcl (Comment 6) - -**Problem:** Sets 9 different wireload models but only calls `report_checks` once at the end. Reviewer says: "Add report_checks call for each set_wire_load_model." - -**File:** `liberty/test/liberty_wireload.tcl` - -**Action:** -1. Add `report_checks -from [get_ports in1] -to [get_ports out1]` after **each** `set_wire_load_model` call (lines 23-39) -2. This produces output that shows timing changes per wireload model — captured in the `.ok` golden file -3. Regenerate `liberty_wireload.ok` - ---- - -### Task 5: Fix liberty_ccsn_ecsm.tcl (Comment 7) - -**Problem:** Test claims to test ECSM but only loads NLDM libraries. No ECSM libraries exist in the test data. - -**File:** `liberty/test/liberty_ccsn_ecsm.tcl` - -**Action:** -1. Rename to `liberty_ccsn.tcl` — remove "ecsm" from the name since no ECSM library is available -2. Update comments to remove ECSM claims -3. Also fix the 13 remaining catch blocks in this file (Task 1 overlap) -4. Update CMakeLists.txt registration -5. Rename `.ok` file accordingly -6. Regenerate `.ok` - ---- - -### Task 6: Fix liberty_sky130_corners.tcl (Comment 8) - -**Problem:** -1. Claims to test corners but never uses `read_liberty -min` or `-max` -2. Contains unrelated ASAP7 library reads (lines 125-153) that have nothing to do with corners - -**File:** `liberty/test/liberty_sky130_corners.tcl` - -**Action:** -1. Use `define_corners` + `read_liberty -corner` to actually test multi-corner: - ```tcl - define_corners fast slow - read_liberty -corner fast ../../test/sky130hd/sky130_fd_sc_hd__ff_n40C_1v95.lib - read_liberty -corner slow ../../test/sky130hd/sky130_fd_sc_hd__ss_n40C_1v40.lib - ``` -2. Add a design + constraints, then `report_checks` per corner to verify different timing -3. Remove unrelated ASAP7 library reads (already covered by other tests) -4. Fix remaining catch blocks (Task 1 overlap) -5. Regenerate `.ok` - ---- - -### Task 7: Fix `test/ $ ./regression -R verilog_specify` (Comment 12) - -**Problem:** The `test/regression` script derives the module name from the current directory: -```bash -module=${script_path#${sta_home}/} # → "test" -module=${module%%/*} # → "test" -``` -Then runs `ctest -L "module_test"`. But tests in `test/CMakeLists.txt` are labeled `"tcl"`, not `"module_test"`. - -**Root cause:** `test/CMakeLists.txt` uses `sta_tcl_test()` which sets label `"tcl"`, while module CMakeLists.txt files set label `"module_"`. - -**Fix options (choose one):** -- **Option A (recommended):** Update `test/regression` to handle the `test/` directory as a special case — when module is "test", use label "tcl" instead of "module_test" -- **Option B:** Add `"module_test"` label to `sta_tcl_test()` function - -I recommend **Option A** because it's minimal and doesn't change the labeling semantics. - -**Action:** -1. Edit `test/regression` to add special case for `test/` directory -2. Verify: `cd test && ./regression -R verilog_specify` passes - ---- - -### Task 8: Clean up module CMakeLists.txt files (Comment 13) - -**Problem:** `search/test/CMakeLists.txt` is 519 lines of repetitive boilerplate: -```cmake -add_test( - NAME tcl.search.timing - COMMAND bash ${STA_HOME}/test/regression.sh $ search_timing - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) -set_tests_properties(tcl.search.timing PROPERTIES LABELS "tcl;module_search") -``` -This 6-line block is repeated ~85 times. The reference (`rsz/test/CMakeLists.txt`) uses a declarative list: -```cmake -or_integration_tests("rsz" TESTS test1 test2 ...) -``` - -**Action:** -1. Create a `sta_module_tests()` CMake function (analogous to `or_integration_tests()`) in the top-level CMake or a shared include: - ```cmake - function(sta_module_tests module_name) - cmake_parse_arguments(ARG "" "" "TESTS" ${ARGN}) - foreach(test_name ${ARG_TESTS}) - add_test( - NAME tcl.${module_name}.${test_name} - COMMAND bash ${STA_HOME}/test/regression.sh $ ${module_name}_${test_name} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) - set_tests_properties(tcl.${module_name}.${test_name} PROPERTIES LABELS "tcl;module_${module_name}") - endforeach() - endfunction() - ``` -2. Convert **all** module CMakeLists.txt files to use this function: - ```cmake - sta_module_tests("search" - TESTS - timing - report_formats - analysis - ... - ) - add_subdirectory(cpp) - ``` -3. Affected files (all using verbose pattern): - - `search/test/CMakeLists.txt` (519 lines → ~85 lines) - - `sdc/test/CMakeLists.txt` (281 lines → ~50 lines) - - `liberty/test/CMakeLists.txt` (218 lines → ~40 lines) - - `verilog/test/CMakeLists.txt` (190 lines → ~35 lines) - - `network/test/CMakeLists.txt` (183 lines → ~30 lines) - - `dcalc/test/CMakeLists.txt` (148 lines → ~25 lines, after Task 3 cleanup) - - `parasitics/test/CMakeLists.txt` (120 lines → ~20 lines) - - `graph/test/CMakeLists.txt` (78 lines → ~15 lines) - - `sdf/test/CMakeLists.txt` (71 lines → ~15 lines) - - `spice/test/CMakeLists.txt` (64 lines → ~12 lines) - - `util/test/CMakeLists.txt` (64 lines → ~12 lines) - - `power/test/CMakeLists.txt` (50 lines → ~10 lines) -4. Verify all tests still pass via `ctest` - ---- - -### Task 9: Expand short C++ tests (Comment 10) — DEFERRED - -**Problem:** Some C++ test files are too short: -- `TestSearchIncremental.cc` — 460 lines, 8 tests -- `TestFindRoot.cc` — 667 lines, 46 tests -- `TestPower.cc` — 914 lines, 71 tests -- `TestSpice.cc` — 1,370 lines, 98 tests - -**Action:** This is a substantial effort. Focus on higher-priority items (Tasks 1-8) first. Expansion can be done incrementally in follow-up PRs. - ---- - -### Task 10: Add incremental timing C++ tests (Comment 5) — DEFERRED - -**Problem:** Reviewer asked for tests that "modify the netlist and do incremental timing." Tcl tests exist (`search_network_edit_replace.tcl`, `search_network_edit_deep.tcl`, `dcalc_annotated_incremental.tcl`) but C++ coverage is thin (`TestSearchIncremental.cc` has only 8 tests). - -**Action:** Expand `TestSearchIncremental.cc` with comprehensive C++ tests. Deferred — same rationale as Task 9. - ---- - -## Execution Order - -``` -Task 1: Remove remaining catch blocks (Comment 3) -Task 2: Fix verilog test quality (Comment 1) -Task 3: Clean up dead dcalc Tcl tests (Comment 2) -Task 4: Fix liberty_wireload.tcl (Comment 6) -Task 5: Rename liberty_ccsn_ecsm.tcl (Comment 7) -Task 6: Fix liberty_sky130_corners.tcl (Comment 8) -Task 7: Fix test/regression for verilog_specify (Comment 12) -Task 8: Clean up all module CMakeLists.txt (Comment 13) ---- -Task 9: Expand short C++ tests (Comment 10) — DEFERRED -Task 10: Add incremental timing C++ tests (Comment 5) — DEFERRED -``` - -Tasks 1-3 can be done in parallel (independent modules). -Tasks 4-6 can be done in parallel (independent liberty test files). -Task 7 is independent. -Task 8 depends on Tasks 1-6 (CMakeLists.txt should reflect final test list). diff --git a/PLAN.md b/PLAN.md deleted file mode 100644 index 9032518d..00000000 --- a/PLAN.md +++ /dev/null @@ -1,104 +0,0 @@ - -# DIRECTION - -다음과 같은 review feedback을 받았어. - -1. 전부 검토한 다음 수정 계획을 짜서 IMPL_PLAN.md 파일에 정리해줘 -2. 이후 내가 계획을 승인하면 실행해줘. - - -# Review feedbacks - - -## Comment 1 - -Arbitrarily picking https://github.com/The-OpenROAD-Project-private/OpenSTA/blob/secure-sta-test-by-opus/verilog/test/verilog_write_types.tcl: - -Including line numbers in the test will quickly become stale, eg - -# Targets: VerilogWriter.cc uncovered functions: -# writeInstBusPin (line 382, hit=0), writeInstBusPinBit (line 416, hit=0) - -The test is just that the file exists and is non-empty which is pretty useless: - -DONE - -# Write basic verilog -set out1 [make_result_file verilog_types_out1.v] -write_verilog $out1 -puts "PASS: write_verilog with multiple types" - -if { [file exists $out1] && [file size $out1] > 0 } { - puts "PASS: output file 1 exists, size: [file size $out1]" -} - -The file consists of many independent tests which will be annoying if you have to debug one (you have to edit the file or skip over all preceding tests). - -Also the .ok has warnings like: -Warning: ../../test/nangate45/Nangate45_typ.lib line 37, library NangateOpenCellLibrary already exists. -because it is loading the same .lib over in the different tests. - -This is not a good quality test. - - -## Comment 2 - -I don't think we should write tcl tests for everything. It is fine for sdc testing but core functions should be tested in c++ (eg dcalc). - -[DIRECTION] Most of the Tcl tests in dcalc/test/*.tcl should be converted to C++ tests. --> DONE -[DIRECTION] Check other module-level Tcl tests too, and do the same conversion if needed. - - -## Comment 3 - -Poking a bit more: - -- Why is a catch used at graph/test/graph_bidirect.tcl#L78 ? I see this pattern scatted about (randomly as far as I can tell). - -DONE - -## Comment 4 -- Many tests use this pattern: -report_checks -puts "PASS: baseline" -I get that we are going to diff the output so that report_checks will be checked against the ok file. Printing PASS is weird as it will always print and be confusing if the test actually failed. - -## Comment 5 -- jk: Where are tests that modify the netlist and do incremental timing? That is a key use case and has been the source of various bugs. - -## Comment 6 -- liberty/test/liberty_wireload.tcl tests setting the wireload but nothing about computing the correct values. - -jk: Add report_checks call for each set_wire_load_model - -## Comment 7 -- liberty/test/liberty_ccsn_ecsm.tcl claims to test ecsm but loads only libraries with nldm models. - -jk: can make a new test for ecsm? - -## Comment 8 -- liberty/test/liberty_sky130_corners.tcl says it tests corners but fails use with read_liberty with -min or -max. It doesn't really tests corners. It has many "tests" like this that do little and have nothing to do with corners: -read_liberty ../../test/asap7/asap7sc7p5t_INVBUF_SLVT_TT_nldm_220122.lib.gz -puts "PASS: read ASAP7 INVBUF SLVT TT" - -## Comment 9 -- I see liberty/test/sdc_disable_case.ok but no corresponding test - -## Comment 10 -- C++ tests are too short. Need long sequence C++ unit tests for each major functionality of each module. -- Need to make too short tests long enough. - -## Comment 11 -- Tcl test result will be compared to the golden .ok files. So printing "PASS" is meaningless. Remove them. - -## Comment 12 - -"sdc/test $ ./regression -R sdc_variables.tcl" works. -But "test $ ./regression -R verilog_specify" does not work. Make this work. - - -## Comment 13 - -search/test/CMakeLists.txt file is messy. Not easy to maintain. -Please enhance the file like /workspace/clean/OpenROAD-flow-scripts/tools/OpenROAD/src/rsz/test/CMakeLists.txt - diff --git a/TODO.md b/TODO.md deleted file mode 100644 index a1695dc0..00000000 --- a/TODO.md +++ /dev/null @@ -1,427 +0,0 @@ -# Test Review: All 13 Comment Violations - -## Summary - -Checked all `*/test/*.tcl` and `*/test/cpp/*.cc` files against all 13 review comments. - -- Comment 1: Stale line numbers/coverage percentages, useless assertions, empty if-bodies -- Comment 2: Tcl tests that should be C++ (dcalc DONE; others checked) -- Comment 3: Unnecessary catch blocks -- Comment 4/11: Meaningless `puts "PASS: ..."` prints -- Comment 5: Missing incremental timing tests (project-wide) -- Comment 6: liberty_wireload.tcl needs report_checks per set_wire_load_model -- Comment 7: ECSM test loads NLDM only -- Comment 8: Load-only tests with no real verification -- Comment 9: Orphan .ok files -- Comment 10: C++ tests too short -- Comment 12: regression -R verilog_specify from test/ -- Comment 13: search/test/CMakeLists.txt messiness - ---- - -## graph/test/ - -DONE - graph/test/graph_incremental.tcl - L2-5: Stale coverage percentages in comments (Comment 1) -DONE - graph/test/graph_delay_corners.tcl - L2-6: Stale coverage percentages in comments (Comment 1) -DONE - graph/test/graph_advanced.tcl -DONE - graph/test/graph_bidirect.tcl -DONE - graph/test/graph_delete_modify.tcl -DONE - graph/test/graph_make_verify.tcl -DONE - graph/test/graph_modify.tcl -DONE - graph/test/graph_operations.tcl -DONE - graph/test/graph_timing_edges.tcl -DONE - graph/test/graph_vertex_edge_ops.tcl -DONE - graph/test/graph_wire_inst_edges.tcl -DONE - graph/test/cpp/TestGraph.cc - -## liberty/test/ - -DONE - liberty/test/liberty_read_sky130.tcl - L1-30: Existence-only test with no data verification (Comment 8) -DONE - liberty/test/liberty_read_nangate.tcl - L26,49,71,222-238: Variables assigned but never inspected beyond existence (Comment 8) -DONE - liberty/test/liberty_read_ihp.tcl - L27,123,182-186,200: Variables assigned but never inspected beyond existence (Comment 8) -DONE - liberty/test/liberty_read_asap7.tcl - L44,62,76,90,104: 11 of 12 loaded libraries have zero verification beyond existence check (Comment 8) -DONE - liberty/test/liberty_arc_model_deep.tcl -DONE - liberty/test/liberty_busport_mem_iter.tcl -DONE - liberty/test/liberty_ccsn.tcl -DONE - liberty/test/liberty_cell_classify_pgpin.tcl -DONE - liberty/test/liberty_cell_deep.tcl -DONE - liberty/test/liberty_clkgate_lvlshift.tcl -DONE - liberty/test/liberty_ecsm.tcl -DONE - liberty/test/liberty_equiv_cells.tcl -DONE - liberty/test/liberty_equiv_cross_lib.tcl -DONE - liberty/test/liberty_equiv_deep.tcl -DONE - liberty/test/liberty_equiv_map_libs.tcl -DONE - liberty/test/liberty_func_expr.tcl -DONE - liberty/test/liberty_leakage_power_deep.tcl -DONE - liberty/test/liberty_multi_corner.tcl -DONE - liberty/test/liberty_multi_lib_equiv.tcl -DONE - liberty/test/liberty_opcond_scale.tcl -DONE - liberty/test/liberty_pgpin_voltage.tcl -DONE - liberty/test/liberty_power.tcl -DONE - liberty/test/liberty_properties.tcl -DONE - liberty/test/liberty_read_asap7.tcl -DONE - liberty/test/liberty_scan_signal_types.tcl -DONE - liberty/test/liberty_seq_scan_bus.tcl -DONE - liberty/test/liberty_sky130_corners.tcl -DONE - liberty/test/liberty_timing_models.tcl -DONE - liberty/test/liberty_timing_types_deep.tcl -DONE - liberty/test/liberty_wireload.tcl -DONE - liberty/test/liberty_write_roundtrip.tcl -DONE - liberty/test/liberty_writer.tcl -DONE - liberty/test/liberty_writer_roundtrip.tcl -DONE - liberty/test/cpp/TestLiberty.cc - -## network/test/ - -DONE - network/test/network_net_cap_query.tcl - L237-238: Empty if-body for found_lib != NULL (Comment 1) - L242-243: Empty if-body for inv_cell != NULL (Comment 1) -DONE - network/test/network_advanced.tcl -DONE - network/test/network_bus_parse.tcl -DONE - network/test/network_cell_match_merge.tcl -DONE - network/test/network_connect_liberty.tcl -DONE - network/test/network_connected_pins.tcl -DONE - network/test/network_deep_modify.tcl -DONE - network/test/network_escaped_names.tcl -DONE - network/test/network_fanin_fanout.tcl -DONE - network/test/network_find_cells_regex.tcl -DONE - network/test/network_gcd_traversal.tcl -DONE - network/test/network_hier_pin_query.tcl -DONE - network/test/network_hierarchy.tcl -DONE - network/test/network_leaf_iter.tcl -DONE - network/test/network_merge_bus_hier.tcl -DONE - network/test/network_modify.tcl -DONE - network/test/network_multi_lib.tcl -DONE - network/test/network_namespace_escape.tcl -DONE - network/test/network_pattern_match.tcl -DONE - network/test/network_properties.tcl -DONE - network/test/network_query.tcl -DONE - network/test/network_sdc_adapt_deep.tcl -DONE - network/test/network_sdc_pattern_deep.tcl -DONE - network/test/network_sdc_query.tcl -DONE - network/test/network_sorting.tcl -DONE - network/test/network_traversal.tcl -DONE - network/test/cpp/TestNetwork.cc - -## parasitics/test/ - -DONE - parasitics/test/parasitics_spef.tcl - L1-18: Minimal test - loads libs, reads SPEF, runs single report_checks with no parasitic value queries (Comment 8) -DONE - parasitics/test/parasitics_annotation_query.tcl -DONE - parasitics/test/parasitics_corners.tcl -DONE - parasitics/test/parasitics_coupling.tcl -DONE - parasitics/test/parasitics_coupling_reduce.tcl -DONE - parasitics/test/parasitics_delete_network.tcl -DONE - parasitics/test/parasitics_detailed.tcl -DONE - parasitics/test/parasitics_estimate_wirerc.tcl -DONE - parasitics/test/parasitics_gcd_reduce.tcl -DONE - parasitics/test/parasitics_gcd_spef.tcl -DONE - parasitics/test/parasitics_manual.tcl -DONE - parasitics/test/parasitics_pi_pole_residue.tcl -DONE - parasitics/test/parasitics_reduce.tcl -DONE - parasitics/test/parasitics_reduce_dcalc.tcl -DONE - parasitics/test/parasitics_spef_formats.tcl -DONE - parasitics/test/parasitics_spef_namemap.tcl -DONE - parasitics/test/parasitics_wireload.tcl -DONE - parasitics/test/cpp/TestParasitics.cc - -## power/test/ - -DONE - power/test/power_report.tcl - L1-10: Minimal test - loads lib, creates clock, runs report_power with no activity or options (Comment 8) -DONE - power/test/power_detailed.tcl -DONE - power/test/power_propagate.tcl -DONE - power/test/power_report_options.tcl -DONE - power/test/power_saif.tcl -DONE - power/test/power_saif_vcd.tcl -DONE - power/test/power_vcd_detailed.tcl -DONE - power/test/cpp/TestPower.cc - -## sdc/test/ - -DONE - sdc/test/cpp/TestSdc.cc - L475: EXPECT_TRUE(true) useless "compilation test" assertion (Comment 1/8) - L568-574: ClkNameLess/ClockNameLess: EXPECT_TRUE(true) useless assertions (Comment 1/8) - L2986-2987: CycleAcctingFunctorsCompile: EXPECT_TRUE(true) useless assertion (Comment 1/8) - L3236,3238: ClkEdgeCmpLess: (void) cast on results instead of assertions (Comment 1) - L3285: ExceptionPathLessComparator: (void) cast instead of assertion (Comment 1) - L3322: ClockIndexLessComparator: (void) cast instead of assertion (Comment 1) - L3359-3375: DeratingFactorsIsOneValue*: (void) casts on is_one/value (Comment 1) - L3428-3429: DeratingFactorsCellIsOneValue: (void) casts (Comment 1) - L3501,3506: CycleAcctingHashEqualLess: (void) casts (Comment 1) - L3647,3664: PinPairLess/HashConstruct: ASSERT_NO_THROW with no real assertion (Comment 1/8) - L3981: ClockDefaultPin: (void) cast instead of asserting nullptr (Comment 1) -DONE - sdc/test/sdc_advanced.tcl -DONE - sdc/test/sdc_capacitance_propagated.tcl -DONE - sdc/test/sdc_clock_groups_sense.tcl -DONE - sdc/test/sdc_clock_operations.tcl -DONE - sdc/test/sdc_clock_removal_cascade.tcl -DONE - sdc/test/sdc_clocks.tcl -DONE - sdc/test/sdc_constraints.tcl -DONE - sdc/test/sdc_cycle_acct_clk_relationships.tcl -DONE - sdc/test/sdc_cycle_acct_genclk.tcl -DONE - sdc/test/sdc_delay_borrow_group.tcl -DONE - sdc/test/sdc_derate_disable_deep.tcl -DONE - sdc/test/sdc_design_rules_limits.tcl -DONE - sdc/test/sdc_disable_case.tcl -DONE - sdc/test/sdc_drive_input_pvt.tcl -DONE - sdc/test/sdc_environment.tcl -DONE - sdc/test/sdc_exception_advanced.tcl -DONE - sdc/test/sdc_exception_intersect.tcl -DONE - sdc/test/sdc_exception_match_filter.tcl -DONE - sdc/test/sdc_exception_merge_priority.tcl -DONE - sdc/test/sdc_exception_override_priority.tcl -DONE - sdc/test/sdc_exception_rise_fall_transitions.tcl -DONE - sdc/test/sdc_exception_thru_complex.tcl -DONE - sdc/test/sdc_exception_thru_net.tcl -DONE - sdc/test/sdc_exception_thru_override.tcl -DONE - sdc/test/sdc_exceptions.tcl -DONE - sdc/test/sdc_filter_query.tcl -DONE - sdc/test/sdc_genclk_advanced.tcl -DONE - sdc/test/sdc_leaf_pin_filter_removal.tcl -DONE - sdc/test/sdc_net_wire_voltage.tcl -DONE - sdc/test/sdc_port_delay_advanced.tcl -DONE - sdc/test/sdc_removal_reset.tcl -DONE - sdc/test/sdc_remove_clock_gating.tcl -DONE - sdc/test/sdc_sense_unset_override.tcl -DONE - sdc/test/sdc_variables.tcl -DONE - sdc/test/sdc_write_comprehensive.tcl -DONE - sdc/test/sdc_write_disabled_groups.tcl -DONE - sdc/test/sdc_write_options.tcl -DONE - sdc/test/sdc_write_read.tcl -DONE - sdc/test/sdc_write_roundtrip.tcl -DONE - sdc/test/sdc_write_roundtrip_full.tcl - -## sdf/test/ - -DONE - sdf/test/sdf_advanced.tcl -DONE - sdf/test/sdf_annotation.tcl -DONE - sdf/test/sdf_check_annotation.tcl -DONE - sdf/test/sdf_cond_pathpulse.tcl -DONE - sdf/test/sdf_device_cond.tcl -DONE - sdf/test/sdf_edge_write.tcl -DONE - sdf/test/sdf_read_write.tcl -DONE - sdf/test/sdf_reread_cond.tcl -DONE - sdf/test/sdf_timing_checks.tcl -DONE - sdf/test/sdf_write_interconnect.tcl -DONE - sdf/test/cpp/TestSdf.cc - -## search/test/ - -DONE - search/test/search_port_pin_properties.tcl - L106-109: Unnecessary catch block for get_property nonexistent (Comment 3) - L216-219: Unnecessary catch block for get_property nonexistent (Comment 3) - L220-224: Unnecessary catch block for get_property nonexistent (Comment 3) -DONE - search/test/search_property_extra.tcl - L106-109: Unnecessary catch block for get_property nonexistent (Comment 3) -DONE - search/test/search_property_libport_deep.tcl - L222-231: 5 unnecessary catch blocks for get_property nonexistent (Comment 3) -DONE - search/test/search_analysis.tcl -DONE - search/test/search_annotated_write_verilog.tcl -DONE - search/test/search_assigned_delays.tcl -DONE - search/test/search_check_timing.tcl -DONE - search/test/search_check_types_deep.tcl -DONE - search/test/search_clk_skew_interclk.tcl -DONE - search/test/search_clk_skew_multiclock.tcl -DONE - search/test/search_corner_skew.tcl -DONE - search/test/search_crpr.tcl -DONE - search/test/search_crpr_data_checks.tcl -DONE - search/test/search_data_check_gated.tcl -DONE - search/test/search_exception_paths.tcl -DONE - search/test/search_fanin_fanout.tcl -DONE - search/test/search_fanin_fanout_deep.tcl -DONE - search/test/search_gated_clk.tcl -DONE - search/test/search_genclk.tcl -DONE - search/test/search_genclk_latch_deep.tcl -DONE - search/test/search_genclk_property_report.tcl -DONE - search/test/search_json_unconstrained.tcl -DONE - search/test/search_latch.tcl -DONE - search/test/search_latch_timing.tcl -DONE - search/test/search_levelize_loop_disabled.tcl -DONE - search/test/search_levelize_sim.tcl -DONE - search/test/search_limit_violations.tcl -DONE - search/test/search_limits_verbose.tcl -DONE - search/test/search_min_period_max_skew.tcl -DONE - search/test/search_min_period_short.tcl -DONE - search/test/search_multiclock.tcl -DONE - search/test/search_multicorner_analysis.tcl -DONE - search/test/search_network_edit_deep.tcl -DONE - search/test/search_network_edit_replace.tcl -DONE - search/test/search_network_sta_deep.tcl -DONE - search/test/search_path_delay_output.tcl -DONE - search/test/search_path_end_types.tcl -DONE - search/test/search_path_enum_deep.tcl -DONE - search/test/search_path_enum_groups.tcl -DONE - search/test/search_path_enum_nworst.tcl -DONE - search/test/search_power_activity.tcl -DONE - search/test/search_property.tcl -DONE - search/test/search_property_deep.tcl -DONE - search/test/search_property_inst_cell.tcl -DONE - search/test/search_pvt_analysis.tcl -DONE - search/test/search_register.tcl -DONE - search/test/search_register_deep.tcl -DONE - search/test/search_register_filter_combos.tcl -DONE - search/test/search_register_latch_sim.tcl -DONE - search/test/search_report_fields_formats.tcl -DONE - search/test/search_report_formats.tcl -DONE - search/test/search_report_gated_datacheck.tcl -DONE - search/test/search_report_json_formats.tcl -DONE - search/test/search_report_path_detail.tcl -DONE - search/test/search_report_path_expanded.tcl -DONE - search/test/search_report_path_latch_expanded.tcl -DONE - search/test/search_report_path_pvt_cap.tcl -DONE - search/test/search_report_path_types.tcl -DONE - search/test/search_sdc_advanced.tcl -DONE - search/test/search_search_arrival_required.tcl -DONE - search/test/search_sim_const_prop.tcl -DONE - search/test/search_sim_logic_clk_network.tcl -DONE - search/test/search_spef_parasitics.tcl -DONE - search/test/search_sta_bidirect_extcap.tcl -DONE - search/test/search_sta_cmds.tcl -DONE - search/test/search_sta_extra.tcl -DONE - search/test/search_tag_path_analysis.tcl -DONE - search/test/search_timing.tcl -DONE - search/test/search_timing_model.tcl -DONE - search/test/search_timing_model_clktree.tcl -DONE - search/test/search_timing_model_deep.tcl -DONE - search/test/search_timing_model_readback.tcl -DONE - search/test/search_worst_slack_sta.tcl -DONE - search/test/search_write_sdf_model.tcl -DONE - search/test/cpp/TestSearch.cc -DONE - search/test/cpp/TestSearchIncremental.cc -DONE - search/test/CMakeLists.txt - -## spice/test/ - -DONE - spice/test/spice_gate_cells.tcl - L1-22: All spice-specific tests removed; now only loads lib and runs report_checks (Comment 8) -DONE - spice/test/spice_gate_advanced.tcl -DONE - spice/test/spice_gcd_gate.tcl -DONE - spice/test/spice_gcd_path.tcl -DONE - spice/test/spice_multipath.tcl -DONE - spice/test/spice_path_min.tcl -DONE - spice/test/spice_subckt_file.tcl -DONE - spice/test/spice_write.tcl -DONE - spice/test/spice_write_options.tcl -DONE - spice/test/cpp/TestSpice.cc - -## util/test/ - -DONE - util/test/util_report_redirect.tcl - L12-43: 5 empty if-bodies (true branch empty, only else has FAIL print) (Comment 1) - L118: catch block without justification comment (Comment 3) -DONE - util/test/util_report_debug.tcl - L3-8: Stale coverage percentages in comments (Comment 1) -DONE - util/test/util_pattern_string.tcl - L2-9: Stale coverage percentages in comments (Comment 1) -DONE - util/test/util_msg_suppress.tcl - L1-12: Calls suppress_msg/unsuppress_msg with no verification (Comment 8) -DONE - util/test/util_commands.tcl -DONE - util/test/util_log_redirect.tcl -DONE - util/test/util_parallel_misc.tcl -DONE - util/test/util_report_format.tcl -DONE - util/test/util_report_string_log.tcl -DONE - util/test/cpp/TestUtil.cc - -## verilog/test/ - -DONE - verilog/test/verilog_attributes.tcl - L2-5: Stale coverage percentages in comments (Comment 1) -DONE - verilog/test/verilog_escaped_write.ok - Orphan .ok file: no corresponding verilog_escaped_write.tcl (Comment 9) -DONE - verilog/test/verilog_remove_cells.ok - Orphan .ok file: no corresponding verilog_remove_cells.tcl (Comment 9) -DONE - verilog/test/verilog_writer_advanced.ok - Orphan .ok file: no corresponding verilog_writer_advanced.tcl (Comment 9) -DONE - verilog/test/cpp/TestVerilog.cc - L1828-1835: EmptyNames: EXPECT_TRUE(true) useless assertion (Comment 1) - L2054-2070: WriteReadVerilogRoundTrip: claims roundtrip but never re-reads; SUCCEED() useless (Comment 1) -DONE - verilog/test/verilog_assign.tcl -DONE - verilog/test/verilog_attributes.tcl -DONE - verilog/test/verilog_bus.tcl -DONE - verilog/test/verilog_bus_partselect.tcl -DONE - verilog/test/verilog_complex_bus.tcl -DONE - verilog/test/verilog_const_concat.tcl -DONE - verilog/test/verilog_coverage.tcl -DONE - verilog/test/verilog_error_paths.tcl -DONE - verilog/test/verilog_escaped_write_bus.tcl -DONE - verilog/test/verilog_escaped_write_complex.tcl -DONE - verilog/test/verilog_escaped_write_const.tcl -DONE - verilog/test/verilog_escaped_write_hier.tcl -DONE - verilog/test/verilog_escaped_write_supply.tcl -DONE - verilog/test/verilog_gcd_large.tcl -DONE - verilog/test/verilog_gcd_writer.tcl -DONE - verilog/test/verilog_hier_write.tcl -DONE - verilog/test/verilog_multimodule_write.tcl -DONE - verilog/test/verilog_preproc_param.tcl -DONE - verilog/test/verilog_read_asap7.tcl -DONE - verilog/test/verilog_remove_cells_basic.tcl -DONE - verilog/test/verilog_remove_cells_complex.tcl -DONE - verilog/test/verilog_remove_cells_hier.tcl -DONE - verilog/test/verilog_remove_cells_multigate.tcl -DONE - verilog/test/verilog_remove_cells_reread.tcl -DONE - verilog/test/verilog_remove_cells_supply.tcl -DONE - verilog/test/verilog_roundtrip.tcl -DONE - verilog/test/verilog_specify.tcl -DONE - verilog/test/verilog_supply_tristate.tcl -DONE - verilog/test/verilog_write_asap7.tcl -DONE - verilog/test/verilog_write_assign_types.tcl -DONE - verilog/test/verilog_write_bus_types.tcl -DONE - verilog/test/verilog_write_complex_bus_types.tcl -DONE - verilog/test/verilog_write_nangate.tcl -DONE - verilog/test/verilog_write_options.tcl -DONE - verilog/test/verilog_write_sky130.tcl -DONE - verilog/test/verilog_writer_asap7.tcl -DONE - verilog/test/verilog_writer_modify.tcl -DONE - verilog/test/verilog_writer_nangate.tcl -DONE - verilog/test/verilog_writer_sky130.tcl -DONE - verilog/test/cpp/TestVerilog.cc - -## test/ (top-level) - -DONE - test/liberty_backslash_eol.tcl - L1-2: Only reads liberty file, .ok is empty - no verification (Comment 8) -DONE - test/liberty_ccsn.tcl - L1-2: Only reads CCSN liberty file, .ok is empty - no verification (Comment 8) -DONE - test/liberty_latch3.tcl - L1-2: Only reads liberty file, .ok is empty - no verification (Comment 8) -DONE - test/package_require.tcl - L1-3: Only runs package require, .ok is empty - no verification (Comment 8) -DONE - test/verilog_specify.tcl - L1-2: Only reads verilog file, .ok is empty - more thorough version exists at verilog/test/verilog_specify.tcl (Comment 8) -DONE - test/disconnect_mcp_pin.tcl -DONE - test/get_filter.tcl -DONE - test/get_is_buffer.tcl -DONE - test/get_is_memory.tcl -DONE - test/get_lib_pins_of_objects.tcl -DONE - test/get_noargs.tcl -DONE - test/get_objrefs.tcl -DONE - test/liberty_arcs_one2one_1.tcl -DONE - test/liberty_arcs_one2one_2.tcl -DONE - test/liberty_float_as_str.tcl -DONE - test/path_group_names.tcl -DONE - test/power_json.tcl -DONE - test/prima3.tcl -DONE - test/report_checks_sorted.tcl -DONE - test/report_checks_src_attr.tcl -DONE - test/report_json1.tcl -DONE - test/report_json2.tcl -DONE - test/suppress_msg.tcl -DONE - test/verilog_attribute.tcl - -## Comment 12 status - -`./regression -R verilog_specify` from test/ directory WORKS. -The script converts underscores to dots and runs `ctest -L "tcl" -R "verilog.specify"`, -which matches `tcl.verilog_specify`. Comment 12 is resolved. - -## dcalc/test/ - -DONE - dcalc/test/cpp/TestDcalc.cc -DONE - dcalc/test/cpp/TestFindRoot.cc diff --git a/TODO2.md b/TODO2.md deleted file mode 100644 index 8758ee53..00000000 --- a/TODO2.md +++ /dev/null @@ -1,292 +0,0 @@ -# TODO2 Review Result - -기준: PLAN.md 코멘트 기반 취약점(약한 smoke 검증, -min/-max 코너 미검증, ECSM 검증 부족, 수정 후 incremental timing 미검증)을 점검함. - -DONE - dcalc/test/cpp/TestDcalc.cc -DONE - dcalc/test/cpp/TestFindRoot.cc -DONE - graph/test/cpp/TestGraph.cc -DONE - graph/test/graph_advanced.tcl -DONE - graph/test/graph_bidirect.tcl -DONE - graph/test/graph_delay_corners.tcl -DONE - graph/test/graph_delete_modify.tcl -DONE - graph/test/graph_incremental.tcl -DONE - graph/test/graph_make_verify.tcl -DONE - graph/test/graph_modify.tcl -DONE - graph/test/graph_operations.tcl -DONE - graph/test/graph_timing_edges.tcl -DONE - graph/test/graph_vertex_edge_ops.tcl -DONE - graph/test/graph_wire_inst_edges.tcl -DONE - liberty/test/cpp/TestLiberty.cc -DONE - liberty/test/liberty_arc_model_deep.tcl -DONE - liberty/test/liberty_busport_mem_iter.tcl -DONE - liberty/test/liberty_ccsn.tcl -DONE - liberty/test/liberty_cell_classify_pgpin.tcl -DONE - liberty/test/liberty_cell_deep.tcl -DONE - liberty/test/liberty_clkgate_lvlshift.tcl -DONE - liberty/test/liberty_ecsm.tcl -DONE - liberty/test/liberty_equiv_cells.tcl -DONE - liberty/test/liberty_equiv_cross_lib.tcl -DONE - liberty/test/liberty_equiv_deep.tcl -DONE - liberty/test/liberty_equiv_map_libs.tcl -DONE - liberty/test/liberty_func_expr.tcl -DONE - liberty/test/liberty_leakage_power_deep.tcl -DONE - liberty/test/liberty_multi_corner.tcl -DONE - liberty/test/liberty_multi_lib_equiv.tcl -DONE - liberty/test/liberty_opcond_scale.tcl -DONE - liberty/test/liberty_pgpin_voltage.tcl -DONE - liberty/test/liberty_power.tcl -DONE - liberty/test/liberty_properties.tcl -DONE - liberty/test/liberty_read_asap7.tcl -DONE - liberty/test/liberty_read_ihp.tcl -DONE - liberty/test/liberty_read_nangate.tcl -DONE - liberty/test/liberty_read_sky130.tcl -DONE - liberty/test/liberty_scan_signal_types.tcl -DONE - liberty/test/liberty_seq_scan_bus.tcl -DONE - liberty/test/liberty_sky130_corners.tcl -DONE - liberty/test/liberty_timing_models.tcl -DONE - liberty/test/liberty_timing_types_deep.tcl -DONE - liberty/test/liberty_wireload.tcl -DONE - liberty/test/liberty_write_roundtrip.tcl -DONE - liberty/test/liberty_writer.tcl -DONE - liberty/test/liberty_writer_roundtrip.tcl -DONE - network/test/cpp/TestNetwork.cc -DONE - network/test/network_advanced.tcl -DONE - network/test/network_bus_parse.tcl -DONE - network/test/network_cell_match_merge.tcl -DONE - network/test/network_connect_liberty.tcl -DONE - network/test/network_connected_pins.tcl -DONE - network/test/network_deep_modify.tcl -DONE - network/test/network_escaped_names.tcl -DONE - network/test/network_fanin_fanout.tcl -DONE - network/test/network_find_cells_regex.tcl -DONE - network/test/network_gcd_traversal.tcl -DONE - network/test/network_hier_pin_query.tcl -DONE - network/test/network_hierarchy.tcl -DONE - network/test/network_leaf_iter.tcl -DONE - network/test/network_merge_bus_hier.tcl -DONE - network/test/network_modify.tcl -DONE - network/test/network_multi_lib.tcl -DONE - network/test/network_namespace_escape.tcl -DONE - network/test/network_net_cap_query.tcl -DONE - network/test/network_pattern_match.tcl -DONE - network/test/network_properties.tcl -DONE - network/test/network_query.tcl -DONE - network/test/network_sdc_adapt_deep.tcl -DONE - network/test/network_sdc_pattern_deep.tcl -DONE - network/test/network_sdc_query.tcl -DONE - network/test/network_sorting.tcl -DONE - network/test/network_traversal.tcl -DONE - parasitics/test/cpp/TestParasitics.cc -DONE - parasitics/test/parasitics_annotation_query.tcl -DONE - parasitics/test/parasitics_corners.tcl -DONE - parasitics/test/parasitics_coupling.tcl -DONE - parasitics/test/parasitics_coupling_reduce.tcl -DONE - parasitics/test/parasitics_delete_network.tcl -DONE - parasitics/test/parasitics_detailed.tcl -DONE - parasitics/test/parasitics_estimate_wirerc.tcl -DONE - parasitics/test/parasitics_gcd_reduce.tcl -DONE - parasitics/test/parasitics_gcd_spef.tcl -DONE - parasitics/test/parasitics_manual.tcl -DONE - parasitics/test/parasitics_pi_pole_residue.tcl -DONE - parasitics/test/parasitics_reduce.tcl -DONE - parasitics/test/parasitics_reduce_dcalc.tcl -DONE - parasitics/test/parasitics_spef.tcl -DONE - parasitics/test/parasitics_spef_formats.tcl -DONE - parasitics/test/parasitics_spef_namemap.tcl -DONE - parasitics/test/parasitics_wireload.tcl -DONE - power/test/cpp/TestPower.cc -DONE - power/test/power_detailed.tcl -DONE - power/test/power_propagate.tcl -DONE - power/test/power_report.tcl -DONE - power/test/power_report_options.tcl -DONE - power/test/power_saif.tcl -DONE - power/test/power_saif_vcd.tcl -DONE - power/test/power_vcd_detailed.tcl -DONE - sdc/test/cpp/TestSdc.cc -DONE - sdc/test/sdc_advanced.tcl -DONE - sdc/test/sdc_capacitance_propagated.tcl -DONE - sdc/test/sdc_clock_groups_sense.tcl -DONE - sdc/test/sdc_clock_operations.tcl -DONE - sdc/test/sdc_clock_removal_cascade.tcl -DONE - sdc/test/sdc_clocks.tcl -DONE - sdc/test/sdc_constraints.tcl -DONE - sdc/test/sdc_cycle_acct_clk_relationships.tcl -DONE - sdc/test/sdc_cycle_acct_genclk.tcl -DONE - sdc/test/sdc_delay_borrow_group.tcl -DONE - sdc/test/sdc_derate_disable_deep.tcl -DONE - sdc/test/sdc_design_rules_limits.tcl -DONE - sdc/test/sdc_disable_case.tcl -DONE - sdc/test/sdc_drive_input_pvt.tcl -DONE - sdc/test/sdc_environment.tcl -DONE - sdc/test/sdc_exception_advanced.tcl -DONE - sdc/test/sdc_exception_intersect.tcl -DONE - sdc/test/sdc_exception_match_filter.tcl -DONE - sdc/test/sdc_exception_merge_priority.tcl -DONE - sdc/test/sdc_exception_override_priority.tcl -DONE - sdc/test/sdc_exception_rise_fall_transitions.tcl -DONE - sdc/test/sdc_exception_thru_complex.tcl -DONE - sdc/test/sdc_exception_thru_net.tcl -DONE - sdc/test/sdc_exception_thru_override.tcl -DONE - sdc/test/sdc_exceptions.tcl -DONE - sdc/test/sdc_filter_query.tcl -DONE - sdc/test/sdc_genclk_advanced.tcl -DONE - sdc/test/sdc_leaf_pin_filter_removal.tcl -DONE - sdc/test/sdc_net_wire_voltage.tcl -DONE - sdc/test/sdc_port_delay_advanced.tcl -DONE - sdc/test/sdc_removal_reset.tcl -DONE - sdc/test/sdc_remove_clock_gating.tcl -DONE - sdc/test/sdc_sense_unset_override.tcl -DONE - sdc/test/sdc_variables.tcl -DONE - sdc/test/sdc_write_comprehensive.tcl -DONE - sdc/test/sdc_write_disabled_groups.tcl -DONE - sdc/test/sdc_write_options.tcl -DONE - sdc/test/sdc_write_read.tcl -DONE - sdc/test/sdc_write_roundtrip.tcl -DONE - sdc/test/sdc_write_roundtrip_full.tcl -DONE - sdf/test/cpp/TestSdf.cc -DONE - sdf/test/sdf_advanced.tcl -DONE - sdf/test/sdf_annotation.tcl -DONE - sdf/test/sdf_check_annotation.tcl -DONE - sdf/test/sdf_cond_pathpulse.tcl -DONE - sdf/test/sdf_device_cond.tcl -DONE - sdf/test/sdf_edge_write.tcl -DONE - sdf/test/sdf_read_write.tcl -DONE - sdf/test/sdf_reread_cond.tcl -DONE - sdf/test/sdf_timing_checks.tcl -DONE - sdf/test/sdf_write_interconnect.tcl -DONE - search/test/cpp/TestSearch.cc -DONE - search/test/cpp/TestSearchIncremental.cc -DONE - search/test/search_analysis.tcl -DONE - search/test/search_annotated_write_verilog.tcl -DONE - search/test/search_assigned_delays.tcl -DONE - search/test/search_check_timing.tcl -DONE - search/test/search_check_types_deep.tcl -DONE - search/test/search_clk_skew_interclk.tcl -DONE - search/test/search_clk_skew_multiclock.tcl -DONE - search/test/search_corner_skew.tcl -DONE - search/test/search_crpr.tcl -DONE - search/test/search_crpr_data_checks.tcl -DONE - search/test/search_data_check_gated.tcl -DONE - search/test/search_exception_paths.tcl -DONE - search/test/search_fanin_fanout.tcl -DONE - search/test/search_fanin_fanout_deep.tcl -DONE - search/test/search_gated_clk.tcl -DONE - search/test/search_genclk.tcl -DONE - search/test/search_genclk_latch_deep.tcl -DONE - search/test/search_genclk_property_report.tcl -DONE - search/test/search_json_unconstrained.tcl -DONE - search/test/search_latch.tcl -DONE - search/test/search_latch_timing.tcl -DONE - search/test/search_levelize_loop_disabled.tcl -DONE - search/test/search_levelize_sim.tcl -DONE - search/test/search_limit_violations.tcl -DONE - search/test/search_limits_verbose.tcl -DONE - search/test/search_min_period_max_skew.tcl -DONE - search/test/search_min_period_short.tcl -DONE - search/test/search_multiclock.tcl -DONE - search/test/search_multicorner_analysis.tcl -DONE - search/test/search_network_edit_deep.tcl -DONE - search/test/search_network_edit_replace.tcl -DONE - search/test/search_network_sta_deep.tcl -DONE - search/test/search_path_delay_output.tcl -DONE - search/test/search_path_end_types.tcl -DONE - search/test/search_path_enum_deep.tcl -DONE - search/test/search_path_enum_groups.tcl -DONE - search/test/search_path_enum_nworst.tcl -DONE - search/test/search_port_pin_properties.tcl -DONE - search/test/search_power_activity.tcl -DONE - search/test/search_property.tcl -DONE - search/test/search_property_deep.tcl -DONE - search/test/search_property_extra.tcl -DONE - search/test/search_property_inst_cell.tcl -DONE - search/test/search_property_libport_deep.tcl -DONE - search/test/search_pvt_analysis.tcl -DONE - search/test/search_register.tcl -DONE - search/test/search_register_deep.tcl -DONE - search/test/search_register_filter_combos.tcl -DONE - search/test/search_register_latch_sim.tcl -DONE - search/test/search_report_fields_formats.tcl -DONE - search/test/search_report_formats.tcl -DONE - search/test/search_report_gated_datacheck.tcl -DONE - search/test/search_report_json_formats.tcl -DONE - search/test/search_report_path_detail.tcl -DONE - search/test/search_report_path_expanded.tcl -DONE - search/test/search_report_path_latch_expanded.tcl -DONE - search/test/search_report_path_pvt_cap.tcl -DONE - search/test/search_report_path_types.tcl -DONE - search/test/search_sdc_advanced.tcl -DONE - search/test/search_search_arrival_required.tcl -DONE - search/test/search_sim_const_prop.tcl -DONE - search/test/search_sim_logic_clk_network.tcl -DONE - search/test/search_spef_parasitics.tcl -DONE - search/test/search_sta_bidirect_extcap.tcl -DONE - search/test/search_sta_cmds.tcl -DONE - search/test/search_sta_extra.tcl -DONE - search/test/search_tag_path_analysis.tcl -DONE - search/test/search_timing.tcl -DONE - search/test/search_timing_model.tcl -DONE - search/test/search_timing_model_clktree.tcl -DONE - search/test/search_timing_model_deep.tcl -DONE - search/test/search_timing_model_readback.tcl -DONE - search/test/search_worst_slack_sta.tcl -DONE - search/test/search_write_sdf_model.tcl -DONE - spice/test/cpp/TestSpice.cc -DONE - spice/test/spice_gate_advanced.tcl -DONE - spice/test/spice_gate_cells.tcl -DONE - spice/test/spice_gcd_gate.tcl -DONE - spice/test/spice_gcd_path.tcl -DONE - spice/test/spice_multipath.tcl -DONE - spice/test/spice_path_min.tcl -DONE - spice/test/spice_subckt_file.tcl -DONE - spice/test/spice_write.tcl -DONE - spice/test/spice_write_options.tcl -DONE - util/test/cpp/TestUtil.cc -DONE - util/test/util_commands.tcl -DONE - util/test/util_log_redirect.tcl -DONE - util/test/util_msg_suppress.tcl -DONE - util/test/util_parallel_misc.tcl -DONE - util/test/util_pattern_string.tcl -DONE - util/test/util_report_debug.tcl -DONE - util/test/util_report_format.tcl -DONE - util/test/util_report_redirect.tcl -DONE - util/test/util_report_string_log.tcl -DONE - verilog/test/cpp/TestVerilog.cc -DONE - verilog/test/verilog_assign.tcl -DONE - verilog/test/verilog_attributes.tcl -DONE - verilog/test/verilog_bus.tcl -DONE - verilog/test/verilog_bus_partselect.tcl -DONE - verilog/test/verilog_complex_bus.tcl -DONE - verilog/test/verilog_const_concat.tcl -DONE - verilog/test/verilog_coverage.tcl -DONE - verilog/test/verilog_error_paths.tcl -DONE - verilog/test/verilog_escaped_write_bus.tcl -DONE - verilog/test/verilog_escaped_write_complex.tcl -DONE - verilog/test/verilog_escaped_write_const.tcl -DONE - verilog/test/verilog_escaped_write_hier.tcl -DONE - verilog/test/verilog_escaped_write_supply.tcl -DONE - verilog/test/verilog_gcd_large.tcl -DONE - verilog/test/verilog_gcd_writer.tcl -DONE - verilog/test/verilog_hier_write.tcl -DONE - verilog/test/verilog_multimodule_write.tcl -DONE - verilog/test/verilog_preproc_param.tcl -DONE - verilog/test/verilog_read_asap7.tcl -DONE - verilog/test/verilog_remove_cells_basic.tcl -DONE - verilog/test/verilog_remove_cells_complex.tcl -DONE - verilog/test/verilog_remove_cells_hier.tcl -DONE - verilog/test/verilog_remove_cells_multigate.tcl -DONE - verilog/test/verilog_remove_cells_reread.tcl -DONE - verilog/test/verilog_remove_cells_supply.tcl -DONE - verilog/test/verilog_roundtrip.tcl -DONE - verilog/test/verilog_specify.tcl -DONE - verilog/test/verilog_supply_tristate.tcl -DONE - verilog/test/verilog_write_asap7.tcl -DONE - verilog/test/verilog_write_assign_types.tcl -DONE - verilog/test/verilog_write_bus_types.tcl -DONE - verilog/test/verilog_write_complex_bus_types.tcl -DONE - verilog/test/verilog_write_nangate.tcl -DONE - verilog/test/verilog_write_options.tcl -DONE - verilog/test/verilog_write_sky130.tcl -DONE - verilog/test/verilog_writer_asap7.tcl -DONE - verilog/test/verilog_writer_modify.tcl -DONE - verilog/test/verilog_writer_nangate.tcl -DONE - verilog/test/verilog_writer_sky130.tcl diff --git a/TODO3.md b/TODO3.md deleted file mode 100644 index e29dd9ea..00000000 --- a/TODO3.md +++ /dev/null @@ -1,192 +0,0 @@ -## DONE - liberty/test/liberty_cell_deep.tcl -- Line 161: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - liberty/test/liberty_write_roundtrip.tcl -- Line 20: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 31: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 42: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 53: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 64: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 75: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 104: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - liberty/test/liberty_writer_roundtrip.tcl -- Line 18: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 30: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - sdc/test/sdc_clock_groups_sense.tcl -- Line 43: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 60: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 75: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 94: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 112: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 131: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 173: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 188: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. - -## DONE - sdc/test/sdc_cycle_acct_clk_relationships.tcl -- Line 130: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. - -## DONE - sdc/test/sdc_cycle_acct_genclk.tcl -- Line 157: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. - -## DONE - sdc/test/sdc_derate_disable_deep.tcl -- Line 89: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 150: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 153: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 197: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. - -## DONE - sdc/test/sdc_disable_case.tcl -- Line 69: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 95: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 106: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 123: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 141: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 172: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 214: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 217: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 220: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. - -## DONE - sdc/test/sdc_exception_thru_net.tcl -- Line 72: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 116: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 119: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. - -## DONE - sdc/test/sdc_filter_query.tcl -- Line 176: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 200: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. - -## DONE - sdc/test/sdc_genclk_advanced.tcl -- Line 112: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 115: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 118: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. - -## DONE - sdc/test/sdc_leaf_pin_filter_removal.tcl -- Line 104: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 123: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 163: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. - -## DONE - sdc/test/sdc_port_delay_advanced.tcl -- Line 243: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 246: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. -- Line 249: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. - -## DONE - sdc/test/sdc_write_read.tcl -- Line 82: Append `diff_files ` after `write_sdc` to verify generated contents without using `catch`. - -## DONE - search/test/search_write_sdf_model.tcl -- Line 20: Append `diff_files ` after `write_sdf` to verify generated contents without using `catch`. -- Line 24: Append `diff_files ` after `write_sdf` to verify generated contents without using `catch`. -- Line 28: Append `diff_files ` after `write_sdf` to verify generated contents without using `catch`. -- Line 32: Append `diff_files ` after `write_sdf` to verify generated contents without using `catch`. -- Line 85: Append `diff_files ` after `write_sdf` to verify generated contents without using `catch`. - -## DONE - util/test/util_parallel_misc.tcl -- Line 151: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - util/test/util_report_debug.tcl -- Line 39: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 48: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - util/test/util_report_string_log.tcl -- Line 45: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 46: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 73: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 74: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 130: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 137: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_assign.tcl -- Line 90: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_bus.tcl -- Line 85: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_bus_partselect.tcl -- Line 58: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 64: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 70: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 95: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 142: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_complex_bus.tcl -- Line 135: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_coverage.tcl -- Line 32: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_escaped_write_bus.tcl -- Line 30: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 31: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_gcd_large.tcl -- Line 55: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 57: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_gcd_writer.tcl -- Line 24: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 30: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 36: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 42: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 59: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 84: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 89: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 99: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 119: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 125: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_hier_write.tcl -- Line 54: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 55: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_remove_cells_basic.tcl -- Line 24: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 25: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 32: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 39: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 46: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 53: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_remove_cells_complex.tcl -- Line 18: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 19: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_remove_cells_hier.tcl -- Line 20: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 21: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_remove_cells_multigate.tcl -- Line 28: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 29: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 30: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 31: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_remove_cells_supply.tcl -- Line 19: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 20: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_write_asap7.tcl -- Line 25: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 26: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 27: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_write_options.tcl -- Line 21: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 22: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 26: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_writer_asap7.tcl -- Line 34: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 35: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 36: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_writer_modify.tcl -- Line 24: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_writer_nangate.tcl -- Line 18: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 19: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. - -## DONE - verilog/test/verilog_writer_sky130.tcl -- Line 19: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. -- Line 20: Replace `[file size ...]` check with `diff_files ` to verify actual file contents without using `catch`. diff --git a/TODO4.md b/TODO4.md deleted file mode 100644 index 185ae5e7..00000000 --- a/TODO4.md +++ /dev/null @@ -1,111 +0,0 @@ -# TODO4 - Modified `*/test` Files Review - -검토 대상(`git status` 기준): -- liberty/test/cpp/CMakeLists.txt -- search/test/cpp/CMakeLists.txt -- liberty/test/cpp/TestLibertyClasses.cc -- liberty/test/cpp/TestLibertyStaBasics.cc -- liberty/test/cpp/TestLibertyStaCallbacks.cc -- search/test/cpp/TestSearchClasses.cc -- search/test/cpp/TestSearchStaDesign.cc -- search/test/cpp/TestSearchStaInit.cc -- search/test/cpp/TestSearchStaInitB.cc -- (deleted) liberty/test/cpp/TestLiberty.cc -- (deleted) search/test/cpp/TestSearch.cc - -정량 요약(신규/분할된 cpp 테스트 파일): -- `TestLibertyClasses.cc`: 320 tests, `<5 checker` 278 -- `TestLibertyStaBasics.cc`: 596 tests, `<5 checker` 533 -- `TestLibertyStaCallbacks.cc`: 125 tests, `<5 checker` 116 -- `TestSearchClasses.cc`: 225 tests, `<5 checker` 215 -- `TestSearchStaDesign.cc`: 655 tests, `<5 checker` 653 -- `TestSearchStaInit.cc`: 629 tests, `<5 checker` 610 -- `TestSearchStaInitB.cc`: 623 tests, `<5 checker` 621, `SUCCEED()` 47 - -필수 요구 반영: -- 짧은 테스트(의미 없는 단일 checker) 보강: 최소 5개 이상의 checker를 갖는 유의미 시나리오 테스트로 재작성 -- `SUCCEED()` 전면 제거: 모두 삭제하고 최소 5개 이상의 실질 checker로 대체 - -TODO - liberty/test/cpp/CMakeLists.txt:20# 기존 단일 타겟(`TestLiberty`) 삭제로 기존 빌드/CI 스크립트 호환성 리스크가 있음. 호환 alias 타겟 유지 또는 마이그레이션 가이드 필요. -TODO - search/test/cpp/CMakeLists.txt:20# 기존 단일 타겟(`TestSearch`) 삭제로 기존 빌드/CI 스크립트 호환성 리스크가 있음. 호환 alias 타겟 유지 또는 마이그레이션 가이드 필요. - -TODO - liberty/test/cpp/TestLibertyClasses.cc:47# 단일 수치/포인터 확인 수준의 짧은 테스트가 대량(320개 중 278개 `<5 checker`) 존재. API 단위 검사 대신 경계값/상호작용 포함 5+ checker 시나리오로 통합 필요. -TODO - liberty/test/cpp/TestLibertyClasses.cc:91# `EXPECT_NE(..., nullptr)` 1개로 끝나는 존재성 테스트 다수. null 이외 상태(단위, suffix, 변환 round-trip, opposite/alias 일관성)까지 검증하도록 보강 필요. - -TODO - liberty/test/cpp/TestLibertyStaBasics.cc:98# 단일 존재성 테스트가 대량(596개 중 533개 `<5 checker`). fixture 기반 실제 동작 검증(입력-출력-불변식)으로 재작성 필요. -TODO - liberty/test/cpp/TestLibertyStaBasics.cc:216# `ASSERT_NO_THROW` 블록에서 결과 상태를 검증하지 않는 패턴 다수. 호출 성공 외 최소 5개 의미 있는 post-condition 검증 추가 필요. -TODO - liberty/test/cpp/TestLibertyStaBasics.cc:5160# `EXPECT_TRUE(true)`는 무의미 테스트. 제거 후 실제 결과(멤버 탐색 성공/실패, 경계 인덱스, 반복자 개수, 이름 일관성 등) 5+ checker로 대체 필요. - -TODO - liberty/test/cpp/TestLibertyStaCallbacks.cc:89# `/tmp` 고정 경로 기반 임시 파일 생성은 병렬 실행/권한/충돌 리스크. 테스트 전용 temp helper(고유 디렉토리+자동 정리)로 교체 필요. -TODO - liberty/test/cpp/TestLibertyStaCallbacks.cc:100# `fopen` 실패 시 조용히 return 하여 원인 은닉. 즉시 ASSERT/FAIL로 실패 원인 표면화 필요. -TODO - liberty/test/cpp/TestLibertyStaCallbacks.cc:113# helper 내부에서 `EXPECT_NE(lib, nullptr)`만 수행하면 호출 테스트가 단일 checker로 축소됨. 파싱된 라이브러리의 핵심 속성 5+ checker 검증으로 승격 필요. -TODO - liberty/test/cpp/TestLibertyStaCallbacks.cc:135# callback 커버리지 테스트 다수가 `ASSERT_NO_THROW` 위주(125개 중 116개 `<5 checker`). callback 결과 side-effect(값 반영, 객체 상태, 에러 경로)를 다중 checker로 검증 필요. - -TODO - search/test/cpp/TestSearchClasses.cc:165# 기본 생성자/이동 생성자 테스트가 타입 값 1~2개 확인에 치중(225개 중 215개 `<5 checker`). 복합 타입 전이/대입 후 불변식까지 5+ checker 보강 필요. -TODO - search/test/cpp/TestSearchClasses.cc:196# `PropertyValue pv(3.14f, nullptr)`는 주석상 잠재 segfault 경로. 유효 Unit fixture 사용 및 문자열 변환/복사/이동 안정성까지 검증 필요. - -TODO - search/test/cpp/TestSearchStaDesign.cc:158# 반환값을 `(void)`로 버리는 테스트 패턴 다수(655개 중 653개 `<5 checker`). 실제 timing 수치/관계/정렬/개수에 대한 5+ checker 검증으로 전환 필요. -TODO - search/test/cpp/TestSearchStaDesign.cc:6403# SDC write 테스트가 파일 open 성공만 확인(단일 checker). 파일 내용 키워드/명령 수/제약 반영 여부를 최소 5개 checker로 검증 필요. -TODO - search/test/cpp/TestSearchStaDesign.cc:6404# `/tmp` 하드코딩 출력 파일명은 병렬 테스트 충돌 위험. test result helper 기반 고유 파일 경로 사용 필요. -TODO - search/test/cpp/TestSearchStaDesign.cc:6457# `ASSERT_NO_THROW` 중심 테스트 다수에서 post-condition 부재. 생성된 path/end/group 결과의 정합성 체크 추가 필요. - -TODO - search/test/cpp/TestSearchStaInit.cc:93# 컴포넌트 존재성 단일 테스트가 과다(629개 중 610개 `<5 checker`). fixture 초기화 불변식 묶음(네트워크/코너/리포터/스레드/namespace) 5+ checker로 통합 필요. -TODO - search/test/cpp/TestSearchStaInit.cc:2473# 함수 주소 존재성 테스트(`auto fn = ...; EXPECT_NE`)는 실행 의미가 없음. 실사용 경로에서 동작/예외/상태 변화를 검증하는 시나리오로 대체 필요. -TODO - search/test/cpp/TestSearchStaInit.cc:2489# `ASSERT_NO_THROW` 후 검증이 없는 no-op 테스트. 호출 전후 상태 차이 및 부수효과를 5+ checker로 확인 필요. - -TODO - search/test/cpp/TestSearchStaInitB.cc:87# 단일 EXPECT_THROW/EXPECT_NE 중심 초단문 테스트가 과다(623개 중 621개 `<5 checker`). 기능 단위 묶음으로 재설계해 의미 있는 5+ checker 검증 필요. -TODO - search/test/cpp/TestSearchStaInitB.cc:237# 함수 포인터 존재성 테스트가 대량(weak fn-pointer tests 253개). 컴파일 타임 보장은 별도 정적 검증으로 넘기고, 런타임 시나리오 테스트로 대체 필요. -TODO - search/test/cpp/TestSearchStaInitB.cc:305# `ASSERT_NO_THROW` 호출-only 패턴이 반복되어 회귀 탐지력이 낮음. 호출 결과/상태 전이/예외 경계까지 포함한 5+ checker 보강 필요. -TODO - search/test/cpp/TestSearchStaInitB.cc:1656# `ClockPinPairLessExists`는 `SUCCEED()`로 종료되는 무의미 테스트. 실제 비교 규칙(반사성/반대칭/일관성/동치) 5+ checker로 대체 필요. - -TODO - liberty/test/cpp/TestLiberty.cc:1# 파일 삭제로 인해 기존 통합 회귀 시나리오가 분할 파일에 완전 이관됐는지 증빙 부재. 고가치 시나리오(파서+STA 연동)의 회귀 추적표 필요. -TODO - search/test/cpp/TestSearch.cc:1# 파일 삭제로 인해 기존 통합 검색/타이밍 회귀 시나리오 이관 검증이 필요. 테스트 명 매핑표와 누락 케이스 점검 필요. - -# SUCCEED() 전면 제거 TODO (요청사항 2 필수 반영) -TODO - search/test/cpp/TestSearchStaInitB.cc:1661# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:2609# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:2620# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:2631# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:2896# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:2906# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:2916# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:2994# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3004# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3014# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3076# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3103# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3472# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3502# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3553# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3565# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3584# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3603# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3670# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3698# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3708# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3720# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3730# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3755# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3890# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:3899# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4053# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4062# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4073# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4084# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4095# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4106# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4117# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4148# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4183# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4192# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4203# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4214# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4251# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4412# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4431# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4442# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4453# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4572# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4583# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4812# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. -TODO - search/test/cpp/TestSearchStaInitB.cc:4823# SUCCEED() 제거 필요. 단순 통과 표시 대신 최소 5개 이상의 의미 있는 checker(결과 값/상태/부수효과/예외 경계)로 대체. diff --git a/TODO6.md b/TODO6.md deleted file mode 100644 index 6b01a3f8..00000000 --- a/TODO6.md +++ /dev/null @@ -1,72 +0,0 @@ -# TODO6: Test Quality Review Against how_to_write_good_tests.md - -## A. Files Over 5,000 Lines (Rule 4) - -| File | Lines | Action | -|------|-------|--------| -| sdc/test/cpp/TestSdc.cc | 10,831 | Split into 2-3 files | -| search/test/cpp/TestSearchStaDesign.cc | 8,736 | Split into 2 files | -| liberty/test/cpp/TestLibertyStaBasics.cc | 6,747 | Split into 2 files | -| network/test/cpp/TestNetwork.cc | 5,857 | Split into 2 files | - -## B. Weak Assertions: (void) Casts (Rule 3) - -Replace `(void)result` with appropriate `EXPECT_*` assertions. - -| File | Test Name(s) | Count | -|------|-------------|-------| -| liberty/test/cpp/TestLibertyStaBasics.cc | TimingArcSetSense, TimingArcSetArcTo, +20 more | ~22 | -| liberty/test/cpp/TestLibertyClasses.cc | DefaultScaleFactors, SetIsClockCell, SetLevelShifterType, SetSwitchCellType | 5 | -| search/test/cpp/TestSearchStaDesign.cc | TagOperations, PathEndCmp, WnsSlackLess, MaxSkewCheckAccessors, MinPeriodCheckAccessors, +100 more | ~100+ | -| search/test/cpp/TestSearchStaInitB.cc | SearchTagCount2, SearchTagGroupCount2, SearchClkInfoCount2, +15 more | ~18 | -| search/test/cpp/TestSearchStaInit.cc | SigmaFactor, SetArcDelayCalc, SetParasiticAnalysisPts, SetTimingDerateGlobal | 4 | -| sdc/test/cpp/TestSdc.cc | ExceptionPathLessComparator, ClockPairLessOp, ClockSetCompare, PinClockPairLessDesign, PinPairHashConstruct | 5 | -| network/test/cpp/TestNetwork.cc | PinIdLessConstructor, NetIdLessConstructor, InstanceIdLessConstructor, PortIdLessConstructor, CellIdLessConstructor, PinSetCompare, NetSetCompare, AdapterCellAttributeMap, AdapterInstanceAttributeMap, AdapterPinVertexId, AdapterBusName | 13 | -| parasitics/test/cpp/TestParasitics.cc | PoleResidueBaseSetPiModel, PoleResidueBaseSetElmore, +11 more | 13 | -| dcalc/test/cpp/TestDcalc.cc | FindRoot (void)root casts | 3 | -| dcalc/test/cpp/TestFindRoot.cc | (void)root cast | 1 | -| power/test/cpp/TestPower.cc | PinActivityQuery (void)density/duty | 1 | -| spice/test/cpp/TestSpice.cc | VertexArrivalForSpice (void)arr | 1 | -| util/test/cpp/TestUtil.cc | RedirectFileAppendBegin (void)bytes_read | 1 | - -## C. Weak Assertions: SUCCEED() / EXPECT_TRUE(true) (Rule 9) - -| File | Test Name(s) | Count | -|------|-------------|-------| -| dcalc/test/cpp/TestDcalc.cc | TimingDmpCeffElmore, TimingDmpCeffTwoPole, TimingLumpedCap, TimingArnoldi, TimingUnit, GraphDelayCalcFindDelays, TimingCcsCeff, TimingPrima, IncrementalDelayWithDesign, SwitchDelayCalcMidFlow, +8 DesignDcalcTest, +6 GraphDelayCalc | ~24 | -| sdc/test/cpp/TestSdc.cc | CycleAcctingHashAndEqual, ClkNameLessInstantiation, ClockNameLessInstantiation | 3 | -| sdf/test/cpp/TestSdf.cc | WriteThenReadSdf, ReadSdfUnescapedDividers, +13 more | ~15 | -| network/test/cpp/TestNetwork.cc | ConstantNetsAndClear, LibertyLibraryIterator | 2 | -| verilog/test/cpp/TestVerilog.cc | StmtDestructor, InstDestructor | 2 | -| util/test/cpp/TestUtil.cc | LogEndWithoutLog, RedirectFileEndWithoutRedirect, StringDeleteCheckNonTmp, PrintConsoleDirect, StatsConstructAndReport, FlushExplicit, PrintErrorConsole, StringDeleteCheckRegular, PrintErrorConsoleViaWarn | 9 | - -## D. Load-only Tcl Tests (Rule 6) - -| File | Issue | -|------|-------| -| sdc/test/sdc_exception_intersect.tcl | write_sdc only, no report_checks/diff_files, .ok empty | -| sdc/test/sdc_exception_thru_complex.tcl | write_sdc only, no report_checks/diff_files, .ok empty | -| sdc/test/sdc_exception_override_priority.tcl | write_sdc only, no report_checks/diff_files, .ok empty | -| sdc/test/sdc_write_roundtrip_full.tcl | write_sdc/read_sdc only, no verification | -| liberty/test/liberty_equiv_cells.tcl | equiv_cells results stored but never verified | -| liberty/test/liberty_multi_lib_equiv.tcl | equiv results stored but never verified | - -## E. Orphan .ok Files (Rule 8) - -| File | Issue | -|------|-------| -| test/delay_calc.ok | No matching .tcl | -| test/min_max_delays.ok | No matching .tcl | -| test/multi_corner.ok | No matching .tcl | -| test/power.ok | No matching .tcl | -| test/power_vcd.ok | No matching .tcl | -| test/sdf_delays.ok | No matching .tcl | -| test/spef_parasitics.ok | No matching .tcl | - -## F. Inline Data File Creation (Rule 1) — Won't Fix - -The following use inline data by design (testing specific parser constructs not covered by checked-in libraries): -- liberty/test/cpp/TestLibertyStaCallbacks.cc — R9_/R11_ tests for specific liberty parser callbacks -- sdf/test/cpp/TestSdf.cc — Testing specific SDF constructs -- spice/test/cpp/TestSpice.cc — Testing CSV/SPICE parser with specific data patterns -- spice/test/*.tcl (8 files) — SPICE tests need inline model/subckt data (no checked-in SPICE models exist) diff --git a/bug_report_missing_write_gate_spice_cmd.md b/bug_report_missing_write_gate_spice_cmd.md deleted file mode 100644 index 657e351f..00000000 --- a/bug_report_missing_write_gate_spice_cmd.md +++ /dev/null @@ -1,36 +0,0 @@ -# Bug Report: Missing SWIG binding for `write_gate_spice_cmd` - -## Summary - -`write_gate_spice` Tcl command always fails with `invalid command name "write_gate_spice_cmd"` because the underlying C++ SWIG binding is not registered. - -## Details - -- **`write_gate_spice`** is defined as a Tcl proc in `spice/WriteSpice.tcl:138` -- It calls `write_gate_spice_cmd` at line 198 to invoke the C++ implementation -- **`write_gate_spice_cmd` is not registered** in any Tcl namespace (neither global nor `::sta::`) -- In contrast, `write_path_spice_cmd` IS correctly registered as `::sta::write_path_spice_cmd` - -## Reproduction - -```tcl -sta::sta -no_init -no_splash -exit /dev/stdin <<'EOF' -puts [info commands ::sta::write_path_spice_cmd] ;# returns ::sta::write_path_spice_cmd -puts [info commands ::sta::write_gate_spice_cmd] ;# returns empty -EOF -``` - -## Impact - -All `write_gate_spice` calls silently fail when wrapped in `catch`, or crash `sta` when called directly. The C++ implementation likely exists in `WriteSpice.cc` but the SWIG `.i` file is missing the binding declaration for `write_gate_spice_cmd`. - -## Affected Test Files - -The following test files had `write_gate_spice` catch blocks that always produced error output: -- `spice/test/spice_gate_advanced.tcl` -- `spice/test/spice_gate_cells.tcl` -- `spice/test/spice_gcd_gate.tcl` -- `spice/test/spice_gcd_path.tcl` -- `spice/test/spice_multipath.tcl` -- `spice/test/spice_subckt_file.tcl` -- `spice/test/spice_write_options.tcl` diff --git a/how_to_write_good_tests.md b/how_to_write_good_tests.md deleted file mode 100644 index 20302cf1..00000000 --- a/how_to_write_good_tests.md +++ /dev/null @@ -1,332 +0,0 @@ -# How to Write Good Tests for OpenSTA - -OpenSTA test review (2025-2026)에서 발견된 주요 품질 문제를 정리한 가이드. -향후 테스트 작성 및 리뷰 시 체크리스트로 활용할 것. - ---- - -## 1. Inline Data File Creation 금지 - -테스트 내에서 임시 파일을 생성하여 데이터를 만들지 말 것. -체크인된 테스트 데이터 파일(`test/nangate45/`, `test/sky130hd/` 등)을 사용해야 한다. - -**Bad:** -```cpp -// 임시 .lib 파일을 C++ 문자열로 직접 생성 -static const char *lib_content = R"( -library(test_lib) { - ... -} -)"; -FILE *f = fopen("/tmp/test.lib", "w"); -fprintf(f, "%s", lib_content); -fclose(f); -sta->readLiberty("/tmp/test.lib", ...); -``` - -**Good:** -```cpp -// 체크인된 실제 liberty 파일 사용 -LibertyLibrary *lib = sta->readLiberty( - "test/nangate45/Nangate45_typ.lib", - sta->cmdCorner(), MinMaxAll::min(), false); -ASSERT_NE(lib, nullptr); -``` - -**이유:** -- 임시 파일 정리 실패 시 테스트 환경 오염 -- 코드 리뷰 시 데이터와 로직이 혼재되어 가독성 저하 - ---- - -## 2. catch 사용 금지 - -Tcl 테스트에서 `catch` 블록으로 에러를 삼키지 말 것. -에러가 발생하면 테스트가 실패해야 한다. - -**Bad:** -```tcl -# 에러를 삼켜서 테스트가 항상 성공하는 것처럼 보임 -catch { report_checks -from [get_ports in1] } result -puts "PASS: report_checks" -``` - -**Good:** -```tcl -# 에러 발생 시 테스트 자체가 실패함 -report_checks -from [get_ports in1] -to [get_ports out1] -``` - -**catch가 허용되는 유일한 경우:** 에러 발생 자체를 검증하는 테스트 -```tcl -# 존재하지 않는 셀을 찾을 때 에러가 발생하는지 확인 -if { [catch { get_lib_cells NONEXISTENT } msg] } { - puts "Expected error: $msg" -} else { - puts "FAIL: should have raised error" -} -``` - -C++ 테스트에서도 동일한 원칙 적용: -```cpp -// Bad: 예외를 삼키는 것 -ASSERT_NO_THROW(some_function()); // 이것만으로 의미 없음 - -// Good: 실제 결과를 검증 -some_function(); -EXPECT_EQ(result, expected_value); - -// 예외 발생을 테스트하는 경우만 EXPECT_THROW 사용 -EXPECT_THROW(sta->endpoints(), Exception); -``` - ---- - -## 3. 테스트 당 최소 5개 이상의 유의미한 assertion - -단순 존재 확인(null 체크, 파일 존재 여부)만으로는 충분하지 않다. -각 테스트 케이스는 기능의 정확성을 검증하는 최소 5개 이상의 checker를 포함해야 한다. - -**Bad:** -```cpp -// 존재 확인만 하는 무의미한 테스트 -TEST_F(StaDesignTest, BasicCheck) { - EXPECT_NE(sta_, nullptr); // 1: null 아님 -- 당연함 - EXPECT_NE(sta_->network(), nullptr); // 2: null 아님 -- 당연함 - SUCCEED(); // 3: 아무것도 검증 안 함 -} -``` - -```tcl -# 파일 존재 여부만 확인하는 무의미한 Tcl 테스트 -write_verilog $out1 -if { [file exists $out1] && [file size $out1] > 0 } { - puts "PASS: output file exists" -} -``` - -**Good:** -```cpp -TEST_F(StaDesignTest, TimingAnalysis) { - Slack worst_slack; - Vertex *worst_vertex; - sta_->worstSlack(MinMax::max(), worst_slack, worst_vertex); - - EXPECT_NE(worst_vertex, nullptr); // 1: vertex 존재 - EXPECT_LT(worst_slack, 0.0f); // 2: slack 범위 확인 - EXPECT_GT(worst_slack, -1e6); // 3: 합리적 범위 - EXPECT_NE(sta_->graph()->pinDrvrVertex( // 4: graph 연결성 - sta_->network()->findPin("r1/D")), nullptr); - PathEndSeq ends = sta_->findPathEnds(...); - EXPECT_GT(ends.size(), 0u); // 5: path 존재 -} -``` - -```tcl -# 실제 타이밍 값을 검증하는 Tcl 테스트 -read_liberty test/nangate45/Nangate45_typ.lib -read_verilog examples/example1.v -link_design top -create_clock -name clk -period 10 {clk1 clk2 clk3} -report_checks -from [get_ports in1] -to [get_ports out1] -# .ok 파일의 diff로 slack, delay, path를 모두 검증 -``` - -**유의미한 assertion 예시:** -- 타이밍 값(slack, delay, slew) 범위 검증 -- 셀/포트/핀의 속성값 비교 -- 그래프 연결성 확인 -- 리포트 출력의 golden file diff -- 에러 조건에서의 예외 발생 확인 - ---- - -## 4. 너무 큰 .cc 파일 지양 - -단일 테스트 소스 파일은 **5,000줄 이하**를 유지할 것. -GCC는 대형 파일에서 `variable tracking size limit exceeded` 경고를 발생시키며, -이는 디버그 빌드의 품질을 저하시킨다. - -**실제 사례:** -- `TestLiberty.cc` (14,612줄) -> 3개 파일로 분할 -- `TestSearch.cc` (20,233줄) -> 4개 파일로 분할 - -**분할 기준:** -- 테스트 fixture 클래스 별로 분할 (서로 다른 SetUp/TearDown) -- 기능 영역별 분할 (class tests / Sta-based tests / callback tests) -- 의존성 수준별 분할 (standalone / Tcl required / design loaded) - -**CMakeLists.txt에서 매크로로 반복 제거:** -```cmake -macro(sta_cpp_test name) - add_executable(${name} ${name}.cc) - target_link_libraries(${name} OpenSTA GTest::gtest GTest::gtest_main ${TCL_LIBRARY}) - target_include_directories(${name} PRIVATE ${STA_HOME}/include/sta ${STA_HOME} ${CMAKE_BINARY_DIR}/include/sta) - gtest_discover_tests(${name} WORKING_DIRECTORY ${STA_HOME} PROPERTIES LABELS "cpp;module_liberty") -endmacro() - -sta_cpp_test(TestLibertyClasses) -sta_cpp_test(TestLibertyStaBasics) -sta_cpp_test(TestLibertyStaCallbacks) -``` - -**부수 효과:** 파일 분할은 빌드 병렬성도 향상시킨다. - ---- - -## 5. `puts "PASS: ..."` 출력 금지 (Tcl 테스트) - -Tcl 테스트의 합격/불합격은 `.ok` golden file과의 diff로 결정된다. -`puts "PASS: ..."` 는 테스트가 실패해도 항상 출력되므로 혼란만 초래한다. - -**Bad:** -```tcl -report_checks -puts "PASS: baseline timing" - -set_wire_load_model "large" -report_checks -puts "PASS: large wireload" -``` - -**Good:** -```tcl -report_checks - -set_wire_load_model "large" -report_checks -# .ok 파일 diff가 검증을 수행함 -``` - ---- - -## 6. Tcl 테스트는 독립적으로 실행 가능해야 함 - -하나의 `.tcl` 파일에 여러 독립 테스트를 넣지 말 것. -디버깅 시 특정 테스트만 실행할 수 없게 된다. - -**Bad:** -```tcl -# 하나의 파일에 10개 테스트가 모두 들어있음 -# 3번째 테스트를 디버깅하려면 1,2번을 먼저 실행해야 함 -read_liberty lib1.lib -puts "PASS: read lib1" -read_liberty lib2.lib -puts "PASS: read lib2" -# ... 반복 -``` - -**Good:** -```tcl -# liberty_read_nangate.tcl - Nangate45 라이브러리 읽기 및 검증 -read_liberty ../../test/nangate45/Nangate45_typ.lib -report_lib_cell NangateOpenCellLibrary/BUF_X1 -report_lib_cell NangateOpenCellLibrary/INV_X1 -# 하나의 주제에 집중하는 독립 테스트 -``` - -동일 liberty를 여러 번 로드하면 `Warning: library already exists` 경고가 발생하므로, -각 테스트 파일은 자체 환경을 구성해야 한다. - ---- - -## 7. Load-only 테스트 금지 - -파일을 읽기만 하고 내용을 검증하지 않는 테스트는 무의미하다. - -**Bad:** -```tcl -read_liberty ../../test/asap7/asap7sc7p5t_INVBUF_SLVT_TT_nldm_220122.lib.gz -puts "PASS: read ASAP7 INVBUF SLVT TT" -# 라이브러리를 읽기만 하고, 셀/포트/타이밍 아크를 전혀 검증하지 않음 -``` - -**Good:** -```tcl -read_liberty ../../test/asap7/asap7sc7p5t_INVBUF_SLVT_TT_nldm_220122.lib.gz -report_lib_cell asap7sc7p5t/INVx1_ASAP7_75t_SL -# .ok diff가 셀 정보, 타이밍 모델, 핀 방향 등을 검증 -``` - ---- - -## 8. Stale 주석 금지 - -커버리지 라인 번호, hit count 등 시간이 지나면 달라지는 정보를 주석에 넣지 말 것. - -**Bad:** -```tcl -# Targets: VerilogWriter.cc uncovered functions: -# writeInstBusPin (line 382, hit=0), writeInstBusPinBit (line 416, hit=0) -``` - -**Good:** -```tcl -# Test write_verilog with bus pins and bit-level connections -``` - ---- - -## 9. `EXPECT_TRUE(true)` / `SUCCEED()` 금지 (C++ 테스트) - -아무것도 검증하지 않는 assertion은 테스트가 아니다. - -**Bad:** -```cpp -TEST_F(SdcTest, ClkNameLess) { - ClkNameLess cmp; - (void)cmp; - EXPECT_TRUE(true); // "컴파일 되면 성공" -- 의미 없음 -} -``` - -**Good:** -```cpp -TEST_F(SdcTest, ClkNameLess) { - Clock *clk_a = makeClock("aaa", ...); - Clock *clk_b = makeClock("bbb", ...); - ClkNameLess cmp; - EXPECT_TRUE(cmp(clk_a, clk_b)); // "aaa" < "bbb" - EXPECT_FALSE(cmp(clk_b, clk_a)); // "bbb" < "aaa" is false - EXPECT_FALSE(cmp(clk_a, clk_a)); // reflexive -} -``` - ---- - -## 10. 코어 기능은 C++ 테스트로 - -Tcl 테스트는 SDC 명령어, 리포트 형식 등 사용자 인터페이스 검증에 적합하다. -delay calculation, graph traversal 등 코어 엔진 로직은 C++ 테스트로 작성해야 한다. - -| 적합 | C++ 테스트 | Tcl 테스트 | -|------|-----------|-----------| -| 예시 | delay calc, graph ops, path search | SDC commands, report formats, write_verilog | -| 장점 | 빠름, 디버거 연동, 세밀한 검증 | golden file diff, 실제 사용 시나리오 | -| 단점 | 셋업 코드 필요 | 느림, 디버깅 어려움 | - ---- - -## 11. Golden File(.ok) 관리 - -- 모든 Tcl 테스트는 대응하는 `.ok` 파일이 있어야 함 (orphan 방지) -- `.ok` 파일 없는 Tcl 테스트는 dead test -- 삭제하거나 `.ok` 생성 -- `.ok` 파일만 있고 `.tcl`이 없는 경우도 정리 대상 - ---- - -## 체크리스트 요약 - -테스트 PR 리뷰 시 다음을 확인: - -- [ ] 인라인 데이터 파일 생성 없음 (체크인된 테스트 데이터 사용) -- [ ] `catch` 블록 없음 (에러 테스트 목적 제외) -- [ ] 테스트 당 assertion 5개 이상 (null 체크만으로 불충분) -- [ ] 소스 파일 5,000줄 이하 -- [ ] `puts "PASS: ..."` 없음 -- [ ] `EXPECT_TRUE(true)` / `SUCCEED()` 없음 -- [ ] load-only 테스트 없음 (읽은 데이터를 반드시 검증) -- [ ] stale 라인 번호/커버리지 주석 없음 -- [ ] 코어 로직은 C++ 테스트로 작성 -- [ ] 대응하는 `.ok` 파일 존재 (Tcl 테스트) -- [ ] 각 테스트 파일은 독립 실행 가능