Remove intermediate doc files
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
This commit is contained in:
parent
e7b861051d
commit
2d2a275ab9
136
BUG_REPORTS.md
136
BUG_REPORTS.md
|
|
@ -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.
|
||||
269
IMPL_PLAN.md
269
IMPL_PLAN.md
|
|
@ -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
104
PLAN.md
|
|
@ -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
427
TODO.md
|
|
@ -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
292
TODO2.md
|
|
@ -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
192
TODO3.md
|
|
@ -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
111
TODO4.md
|
|
@ -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(결과 값/상태/부수효과/예외 경계)로 대체.
|
||||
72
TODO6.md
72
TODO6.md
|
|
@ -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)
|
||||
|
|
@ -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`
|
||||
|
|
@ -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 테스트)
|
||||
- [ ] 각 테스트 파일은 독립 실행 가능
|
||||
Loading…
Reference in New Issue