Professional Test Point Insertion and Circuit Testability Analysis Tool
A comprehensive open-source framework for automated test point insertion (TPI) and digital circuit testability analysis, featuring advanced testability metrics, reconvergent fanout detection, and design-for-testability (DFT) capabilities.
# Clone the repository
git clone https://github.com/ranaumarnadeem/OpenTestability.git
cd OpenTestability
# Set up virtual environment (WSL recommended)
python3 -m venv venv
source venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Place PDK liberty files
# Copy your Sky130 liberty files to data/pdk/ directory
# Default: data/pdk/sky130_tt_1.8_25_nldm.libOpenTestability requires specifying a mode flag (--yosys or --genus) to run:
# Genus Mode - Traditional workflow with full command set
python3 opentest --genus
opentest [genus]> cop -i design.v
opentest [genus]> scoap -i design.v
opentest [genus]> tpi -i netlist.json -m metrics.json -t 50 -n 10
opentest [genus]> help
opentest [genus]> exit
# Yosys Mode - Streamlined workflow for Yosys synthesis outputs
python3 opentest --yosys
opentest [yosys]> cop -i design.v -j
opentest [yosys]> scoap -i design.v
opentest [yosys]> analyze_and_add_tp -i design.json -m metrics.json
opentest [yosys]> help
opentest [yosys]> exit
# View available commands for each mode
python3 opentest --genus
opentest [genus]> help
python3 opentest --yosys
opentest [yosys]> helpTo use Genus mode: python3 opentest --genus
| Command | Description | Usage |
|---|---|---|
tpi |
Test Point Insertion | tpi -i <netlist.json> -m <metrics.json> [-o <output.v>] [-t <threshold>] [-n <max_points>] |
cop |
Calculate COP metrics | cop -i <input.v/.txt> [-o <output.txt>] [-r] [-a <algorithm>] [-j] |
scoap |
Calculate SCOAP metrics | scoap -i <input.v/.txt> [-o <output.json>] [-r] [-a <algorithm>] |
auto-cop |
COP with auto reconvergence | auto-cop -i <input.txt> [-o <output.txt>] [-w <workers>] |
auto-scoap |
SCOAP with auto reconvergence | auto-scoap -i <input.txt> [-o <output.json>] [-w <workers>] |
parse |
Parse Verilog netlist | parse -i <input.v> [-o <output.json>] [-d <directory>] [-v] |
convert |
Convert text to JSON | convert -i <input.txt> [-v] |
dag |
Create DAG from netlist | dag -i <input.json> [-o <output.json>] [-r] [-a <algorithm>] |
reconv |
Basic reconvergence detection | reconv -i <input.json> [-o <output.json>] [-d <directory>] [-v] |
simple |
Simple reconvergence detection | simple -i <input.json> [-o <output.json>] [-d <directory>] [-v] |
advanced |
Advanced reconvergence detection | advanced -i <input.json> [-o <output.json>] [-d <directory>] [-v] |
compare |
Compare all algorithms | compare -i <input.json> [-v] |
test-reconv |
Run integration tests | test-reconv [-v] |
visualize |
Generate circuit visualization | visualize -i <input.json> [-o <output.png>] [-d <directory>] [-v] |
status |
Show project status | status |
help |
Show help information | help [command] |
To use Yosys mode: python3 opentest --yosys
| Command | Description | Usage |
|---|---|---|
cop |
Calculate COP metrics | cop -i <input.v> [-o <output.json>] [-j] |
scoap |
Calculate SCOAP metrics | scoap -i <input.v> [-o <output.json>] |
analyze_and_add_tp |
Complete TPI pipeline | analyze_and_add_tp -i <input> -m <metrics.json> [-o <output>] [-t <threshold>] [-n <max_points>] |
help |
Show help information | help [command] |
OpenTestability uses PDK liberty files for cell library information during test point insertion and tool integration.
Place your PDK liberty files in the data/pdk/ directory:
data/pdk/
└── sky130_tt_1.8_25_nldm.lib # Default Sky130 liberty file- Sky130: Standard cell library for test point insertion
- Custom PDKs: Place your liberty files in
data/pdk/and update configuration
The default liberty file path is data/pdk/sky130_tt_1.8_25_nldm.lib and is used by:
- Test point insertion for cell selection
- Tool integration scripts (Fault, OpenROAD, Yosys)
- Synthesis and ATPG workflows
Automated design-for-testability (DFT) implementation:
- Metrics-Driven: Analyzes COP/SCOAP metrics to identify hard-to-test signals
- Observation Points: Inserts buffers to expose internal signals as primary outputs
- Control Points: Inserts muxes to allow external control of signal values during test mode
- Industry-Standard Output: Generates Verilog-2001 compatible with commercial EDA tools
- Professional DFT Interface: Clean separation of functional and test interfaces
# Genus Mode - Complete TPI workflow
python3 opentest --genus
opentest [genus]> cop -i design.v -j
opentest [genus]> tpi -i design.json -m metrics.json -t 50 -n 10
# Yosys Mode - Streamlined workflow
python3 opentest --yosys
opentest [yosys]> cop -i design.v -j
opentest [yosys]> analyze_and_add_tp -i design.json -m metrics.json -t 50 -n 10Streamlined workflow for Yosys synthesis outputs:
- Simplified Commands: Core testability commands (cop, scoap)
- Complete Pipeline: analyze_and_add_tp for end-to-end TPI workflow
- Direct Integration: Works with Yosys JSON and Verilog formats
# Start Yosys mode
python3 opentest --yosys
# Run testability analysis
opentest [yosys]> cop -i design.v -j
opentest [yosys]> scoap -i design.v
# Complete TPI pipeline
opentest [yosys]> analyze_and_add_tp -i design.json -m metrics.json -t 40 -n 15- -i, --input: Parsed netlist file (JSON format from parse command)
- -m, --metrics: Metrics file (COP or SCOAP JSON output)
- -o, --output: Output Verilog file (default:
<input>_tp.v) - -t, --threshold: Testability threshold (default: 50) - lower values mean harder to test
- -n, --max-points: Maximum test points to insert (default: 10)
- -d, --directory: Output directory (default:
data/TPI/) - -v, --verbose: Enable verbose output and debugging information
The TPI command generates enhanced Verilog with:
- Observation Points: Internal signals buffered to new primary outputs (
tp_obs_<signal>) - Control Points: Muxes for signal override via test enable (
tp_ctrl_<signal>,test_en) - Gate Overhead: Detailed reporting of added gates and area impact
- Tool Compatibility: Compatible with Fault, Yosys, OpenROAD, Verilator, and commercial tools
Supporting TPI with comprehensive analysis capabilities:
- Direct Verilog Analysis: Both modes support direct Verilog input
- Automatic Pipeline: Handles parsing, DAG creation, reconvergence detection, and analysis
- Smart Parallel: Automatically enables parallel mode for circuits >100,000 gates
- Custom Output: Supports
-ooption for custom output filenames
# Genus Mode
python3 opentest --genus
opentest [genus]> cop -i my_design.v
opentest [genus]> scoap -i my_design.v
# Yosys Mode
python3 opentest --yosys
opentest [yosys]> cop -i my_design.v
opentest [yosys]> scoap -i my_design.vAutomatic reconvergence handling for accurate testability metrics:
- Automatic Detection: COP and SCOAP now automatically detect reconvergent fanout
- Three Algorithms: Basic, Simple (recommended), and Advanced methods
- Correlation-Aware: Bayesian network-based adjustments for accurate metrics
- 98% Accuracy: Simple algorithm achieves 98%+ match with baseline methods
from opentestability.core.cop import run_cop
# Automatic reconvergence detection and parallel computation
run_cop('circuit.txt', 'results.txt',
reconvergence_algorithm='auto', # Auto-select best algorithm
auto_parallel=True) # Parallel for >100k gatesAutomatic parallel processing for large circuits:
- Automatic Activation: Enabled for circuits >100,000 gates
- 3-4x Speedup: Significant performance improvement on large designs
- Thread-Safe: Concurrent processing of reconvergent fanout regions
- Configurable: Adjustable worker threads (default: 4)
The codebase has been reorganized for better maintainability:
- COP package: Includes parallel computation support
- SCOAP package: Split into 7 focused modules
- Reconvergence package: Three algorithm implementations (basic, simple, advanced) with integration module
- DAG package: Clean separation of DAG construction logic
- 100% backward compatible: Old import paths still work
- Purpose: Calculate probability-based observability metrics
- Reconvergence-Aware: Automatic correlation adjustments at fanout reconvergence
- Parallel Support: Automatic for circuits >100,000 gates
- Use Case: Probability-based test pattern generation, fault coverage estimation
- Purpose: Calculate controllability and observability metrics
- Reconvergence-Aware: Integrated fanout point detection and processing
- Parallel Support: Concurrent processing of reconvergent cones
- Use Case: Test point insertion, DFT optimization, circuit testability analysis
- Accuracy: 98%+ match with baseline methods
- Performance: Optimized for real-world circuits
- Use Case: Production applications, general circuit analysis
- Accuracy: Highly selective, research-grade
- Performance: Best for complex pipelined circuits
- Use Case: Research, academic analysis, complex VLSI designs
- Accuracy: Traditional approach
- Performance: Reliable baseline
- Use Case: Comparison, legacy compatibility
opentestability/
├── src/opentestability/
│ ├── core/ # Core analysis algorithms
│ │ ├── scoap/ # SCOAP testability analysis
│ │ │ ├── main.py # Main entry point
│ │ │ ├── netlist_parser.py # Netlist parsing
│ │ │ ├── gate_logic.py # Gate-level computation
│ │ │ ├── controllability.py # CC0/CC1 algorithms
│ │ │ ├── observability.py # CO algorithms
│ │ │ ├── parallel.py # Parallel computation
│ │ │ └── output.py # Result formatting
│ │ ├── dag/ # DAG construction
│ │ │ └── builder.py # DAG builder
│ │ ├── reconvergence/ # Reconvergence detection
│ │ │ ├── basic.py # Baseline BFS algorithm
│ │ │ ├── simple.py # Simplified paper algorithm
│ │ │ └── advanced.py # Advanced paper algorithm
│ │ └── testpoint/ # Test Point Insertion
│ │ ├── main.py # TPI orchestrator
│ │ ├── analyzer.py # Metrics analysis
│ │ ├── designer.py # Test point design
│ │ ├── inserter.py # Netlist modification
│ │ ├── verilog_writer.py # Verilog generation
│ │ ├── validator.py # Result validation
│ │ └── tech_library.py # Cell library support
│ ├── parsers/
│ │ ├── verilog_parser.py # Verilog parsing
│ │ ├── yosys_parser.py # Yosys JSON parsing
│ │ └── yosys_writer.py # Yosys JSON generation
│ ├── visualization/
│ │ └── graph_renderer.py # Circuit visualization
│ └── utils/
│ ├── file_utils.py # File utilities
│ └── user_interaction.py # User prompts & format detection
├── data/
│ ├── input/ # Input Verilog/Yosys files
│ ├── parsed/ # Parsed netlists
│ ├── pdk/ # PDK liberty files (place Sky130 .lib files here)
│ ├── temp/
│ │ └── yosys_metadata/ # Temporary Yosys metadata storage
│ ├── dag_output/ # DAG representations
│ ├── reconvergence_output/ # Analysis results
│ └── scoap_output/ # SCOAP results
├── tests/ # Test suite
├── docs/ # Documentation
└── examples/ # Example circuits
We welcome contributions from the open source community!
- Contributing Guidelines: CONTRIBUTING.md
- License: Apache-2.0
Important: For documentation changes, always use the docs branch:
git checkout docs
# Make your documentation changes
git commit -m "docs: your changes"
git push origin docs# Install development dependencies
pip install -r requirements-dev.txt
# Run tests
python -m pytest tests/
# Run linting
flake8 src/
black src/- Create a new detector class in
src/opentestability/core/ - Implement the standard interface
- Add CLI command in
opentestability - Update comparison framework
- Add tests and documentation
This project is licensed under the Apache-2.0 License - see the LICENSE file for details.
- Xu & Edirisuriya (2004): Research paper "A New Way of Detecting Reconvergent Fanout Branch Pairs in Logic Circuits"
- Open Source Community: Contributors and maintainers
- Academic Research: VLSI testing and design automation community
- Zainalabedin Navabi: Digital System Test and Testable Design Using HDL Models and Architectures -Laung-Terng Wang: VLSI Test Principles and Architectures
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Documentation: OpenTestability Docs
- Changelog: CHANGELOG.md
OpenTestability - Professional Circuit Testability Analysis