Remove intermediate doc files

Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
This commit is contained in:
Jaehyun Kim 2026-03-11 17:46:38 +09:00
parent e7b861051d
commit 2d2a275ab9
10 changed files with 0 additions and 1971 deletions

View File

@ -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 <name>` 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.

View File

@ -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_<name>"`.
**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 $<TARGET_FILE:sta> 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 $<TARGET_FILE:sta> ${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).

104
PLAN.md
View File

@ -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

427
TODO.md
View File

@ -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

292
TODO2.md
View File

@ -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

192
TODO3.md
View File

@ -1,192 +0,0 @@
## DONE - liberty/test/liberty_cell_deep.tcl
- Line 161: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - liberty/test/liberty_write_roundtrip.tcl
- Line 20: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 31: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 42: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 53: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 64: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 75: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 104: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - liberty/test/liberty_writer_roundtrip.tcl
- Line 18: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 30: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - sdc/test/sdc_clock_groups_sense.tcl
- Line 43: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 60: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 75: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 94: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 112: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 131: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 173: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 188: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
## DONE - sdc/test/sdc_cycle_acct_clk_relationships.tcl
- Line 130: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
## DONE - sdc/test/sdc_cycle_acct_genclk.tcl
- Line 157: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
## DONE - sdc/test/sdc_derate_disable_deep.tcl
- Line 89: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 150: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 153: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 197: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
## DONE - sdc/test/sdc_disable_case.tcl
- Line 69: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 95: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 106: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 123: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 141: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 172: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 214: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 217: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 220: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
## DONE - sdc/test/sdc_exception_thru_net.tcl
- Line 72: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 116: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 119: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
## DONE - sdc/test/sdc_filter_query.tcl
- Line 176: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 200: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
## DONE - sdc/test/sdc_genclk_advanced.tcl
- Line 112: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 115: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 118: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
## DONE - sdc/test/sdc_leaf_pin_filter_removal.tcl
- Line 104: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 123: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 163: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
## DONE - sdc/test/sdc_port_delay_advanced.tcl
- Line 243: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 246: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
- Line 249: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
## DONE - sdc/test/sdc_write_read.tcl
- Line 82: Append `diff_files <golden_file> <outfile>` after `write_sdc` to verify generated contents without using `catch`.
## DONE - search/test/search_write_sdf_model.tcl
- Line 20: Append `diff_files <golden_file> <outfile>` after `write_sdf` to verify generated contents without using `catch`.
- Line 24: Append `diff_files <golden_file> <outfile>` after `write_sdf` to verify generated contents without using `catch`.
- Line 28: Append `diff_files <golden_file> <outfile>` after `write_sdf` to verify generated contents without using `catch`.
- Line 32: Append `diff_files <golden_file> <outfile>` after `write_sdf` to verify generated contents without using `catch`.
- Line 85: Append `diff_files <golden_file> <outfile>` 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 <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - util/test/util_report_debug.tcl
- Line 39: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 48: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` 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 <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 46: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 73: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 74: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 130: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 137: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_assign.tcl
- Line 90: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_bus.tcl
- Line 85: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_bus_partselect.tcl
- Line 58: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 64: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 70: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 95: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 142: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_complex_bus.tcl
- Line 135: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_coverage.tcl
- Line 32: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` 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 <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 31: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_gcd_large.tcl
- Line 55: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 57: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_gcd_writer.tcl
- Line 24: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 30: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 36: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 42: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 59: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 84: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 89: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 99: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 119: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 125: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_hier_write.tcl
- Line 54: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 55: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` 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 <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 25: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 32: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 39: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 46: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 53: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` 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 <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 19: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` 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 <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 21: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` 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 <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 29: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 30: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 31: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` 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 <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 20: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_write_asap7.tcl
- Line 25: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 26: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 27: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_write_options.tcl
- Line 21: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 22: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 26: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_writer_asap7.tcl
- Line 34: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 35: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 36: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_writer_modify.tcl
- Line 24: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_writer_nangate.tcl
- Line 18: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 19: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
## DONE - verilog/test/verilog_writer_sky130.tcl
- Line 19: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.
- Line 20: Replace `[file size ...]` check with `diff_files <golden_file> <outfile>` to verify actual file contents without using `catch`.

111
TODO4.md
View File

@ -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(결과 값/상태/부수효과/예외 경계)로 대체.

View File

@ -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)

View File

@ -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`

View File

@ -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 테스트)
- [ ] 각 테스트 파일은 독립 실행 가능