Skip to main content

ChipIQ - Intelligent EDA AI-Agents for Chip Design

Project description

ChipIQ

Intelligent EDA AI-Agents for chip design.

ChipIQ provides powerful tools for analyzing digital simulation waveform files (VCD format) with advanced pattern matching capabilities.

Installation

Install ChipIQ using uv:

uv add chipiq

Quick Start

View the user manual:

chipiq simiq docs

Build MacOS/Linux/Windows executable:

source ./scripts/make

Analyze a VCD waveform file:

chipiq simiq vcd path/to/waveform.vcd

For convenience: build if needed and run

chipiq_dev <options>

Run regression tests:

uv run pytest

Command Line Interface

Basic Usage

chipiq <COMMAND> <REPORT> [OPTIONS]

Available commands: simiq, version

Available reports: docs, info, modules, signals, vcd, license

Report Types

Each report type has specific options:

Common Options:

  • -h, --help - Show help message

vcd report (show signal value changes):

  • FILE - VCD file path or URI (required)
  • -f, --first FIRST - Starting timestamp for parsing (default: start of file)
  • -i, --include PATTERN [PATTERN ...] - Signal name patterns to include (default: .* = top level signals)
  • -e, --exclude PATTERN [PATTERN ...] - Signal name patterns to exclude (default: none)
  • -n N - Maximum number of timestamps to report (default: 10)
  • -g, --group-by {time,name} - Group results by timestamp or signal name (default: time)

info report (file metadata):

  • FILE - VCD file path or URI (required)

modules report (module hierarchy):

  • FILE - VCD file path or URI (required)
  • -i, --include PATTERN [PATTERN ...] - Signal name patterns to include
  • -e, --exclude PATTERN [PATTERN ...] - Signal name patterns to exclude

signals report (list signals):

  • FILE - VCD file path or URI (required)
  • -i, --include PATTERN [PATTERN ...] - Signal name patterns to include
  • -e, --exclude PATTERN [PATTERN ...] - Signal name patterns to exclude

docs report (show documentation):

  • No arguments required

license report (show license info):

  • No arguments required

Report Types

1. docs - Display detailed help and examples

chipiq simiq docs

2. info - Show file metadata and statistics

chipiq simiq info waveform.vcd

Example output:

timescale:        1 fs
date:             Fri Nov 21 16:56:29 2014
version:          GHDL v0
timestamp range:  0 to 210000000
filename:         waveform.vcd
file size:        2,195 bytes

3. modules - List all module hierarchies

chipiq simiq modules waveform.vcd --include "**"

4. signals - List all signals with properties

chipiq simiq signals waveform.vcd --include "cpu.*"

5. vcd - Parse and display signal value changes

chipiq simiq vcd waveform.vcd --include "clk" -n 10

6. license - Display license properties and status

chipiq simiq license

Example output:

SimIQ: License Properties:

is_valid:        True
lic_company:     chipiq
lic_product:     simiq
lic_user:        user@example.com
lic_valid_to:    1767225599
message:         Valid until 2025-12-31 23:59:59 UTC.

Signal Pattern Matching

ChipIQ uses powerful pattern matching with * and ** to filter signals in the hierarchy:

  • * matches zero or more characters except . (within a single hierarchy level)
  • ** matches zero or more characters including . (across hierarchy levels)
  • . matches a literal dot character
  • Pattern preprocessing: Simple patterns without leading ., without *. prefix, and without ** are automatically expanded:
    • data**.data and **.data.* (matches any leaf named "data" - signal or module)
    • .data.data (no expansion, matches only root-level)
    • *.data*.data (no expansion, starts with *.)
    • cpu.alu**.cpu.alu and **.cpu.alu.* (matches hierarchy path anywhere)
    • data***.data* and **.data*.* (matches leaves starting with "data")
    • **data****data** (no expansion, contains **)

Pattern Examples

Consider these signal names in a CPU design:

  • .data
  • .clk
  • .dut.data
  • .dut.clk
  • .cpu.alu.data
  • .cpu.ctrl.enable
  • .tb.dut.data_in
  • .tb.dut.cpu.alu.result
Pattern Matches Explanation
** All signals Universal match
data .data, .dut.data, .cpu.alu.data Expands to **.data and **.data.*, matches any leaf "data"
.data .data only Exact root-level match (no expansion)
**.data .data, .dut.data, .cpu.alu.data Explicit form, matches leaf "data" anywhere
data* .data, .tb.dut.data_in Expands to **.data* and **.data*.*, matches leaves starting with "data"
.data* .data only Root-level names starting with "data"
*data* .data, .dut.data, .tb.dut.data_in Expands to **.*data* and **.*data*.*, any leaf containing "data"
**data** All with "data" substring Matches "data" anywhere in full path
cpu.* Direct children of "cpu" Expands to **.cpu.* and **.cpu.*.*
**.cpu.* .cpu.alu, .cpu.ctrl Explicit form, direct children of "cpu" anywhere
**.cpu.** .cpu.alu.data, .cpu.ctrl.enable, .tb.dut.cpu.alu.result "cpu" module with all descendants
**.alu.* .cpu.alu.data, .tb.dut.cpu.alu.result Direct children of "alu" anywhere
**.alu.** .cpu.alu.data, .cpu.alu.adder.sum, .tb.dut.cpu.alu.result "alu" module with all descendants
.* .data, .clk Top-level leaves only
.*.*.* .cpu.alu.data, .cpu.ctrl.enable Exactly 3 segments from root

Real-World CLI Examples

Debugging Clock and Data Signals

# Find all clock-related signals in the design
chipiq simiq signals processor.vcd --include "*clk*" "*clock*"

# Find all data signals anywhere in hierarchy
chipiq simiq signals design.vcd --include "data"

# Analyze data signal changes in the CPU module
chipiq simiq vcd processor.vcd --include "**.cpu.**data*" -n 20

# Check specific signal anywhere in hierarchy
chipiq simiq vcd processor.vcd --include "data" --first 1000000 -n 5

Analyzing a Specific Module

# List all signals in the ALU module (at any hierarchy level)
chipiq simiq signals design.vcd --include "alu.**"

# Monitor ALU inputs and outputs only (direct children)
chipiq simiq vcd design.vcd --include "alu.*" -n 50

# Watch ALU operations excluding internal debug signals
chipiq simiq vcd design.vcd --include "alu.**" --exclude "*debug*" "*test*"

Memory Interface Debugging

# Monitor all memory controller signals
chipiq simiq vcd soc.vcd --include "mem_ctrl.**" --group-by name

# Check memory write operations
chipiq simiq vcd soc.vcd --include "*mem*wr*" "*mem*write*" -n 30

# Analyze top-level memory interface only
chipiq simiq signals soc.vcd --include ".mem_*"

Finding Reset Signals

# Find all reset signals in the design
chipiq simiq signals chip.vcd --include "*rst*" "*reset*"

# Monitor reset behavior across all modules
chipiq simiq vcd chip.vcd --include "*rst*" -n 15 --group-by time

Pipeline Analysis

# Analyze all pipeline stages
chipiq simiq vcd cpu.vcd --include "pipeline.**" -n 100

# Monitor specific pipeline stage
chipiq simiq vcd cpu.vcd --include "pipeline.execute.*" --group-by name

# Check pipeline control signals only
chipiq simiq vcd cpu.vcd --include "pipeline.**ctrl*" "pipeline.**valid*"

Excluding Noise

# Analyze design without clocks and resets
chipiq simiq vcd design.vcd --include "**" --exclude "*clk*" "*rst*"

# Monitor CPU excluding testbench signals
chipiq simiq vcd test.vcd --include "cpu.**" --exclude "*tb*" "*test*" "*monitor*"

# Check signals at top-level, excluding debug
chipiq simiq vcd design.vcd --include ".*" --exclude ".*debug*"

Bus Interface Debugging

# Monitor all AXI bus signals
chipiq simiq vcd soc.vcd --include "*axi*" -n 40

# Check specific AXI channel (read address)
chipiq simiq vcd soc.vcd --include "*axi*ar*" --group-by name

# Analyze APB peripheral at any level
chipiq simiq vcd soc.vcd --include "apb_peripheral.**"

State Machine Analysis

# Monitor FSM state changes
chipiq simiq vcd controller.vcd --include "*fsm*state*" -n 20 --group-by time

# Check all FSM signals
chipiq simiq vcd controller.vcd --include "fsm.**" --group-by name

# Multiple state machines comparison
chipiq simiq vcd design.vcd --include "*state*" --exclude "*next_state*" -n 50

Pattern Matching Examples

# Match leaf named "data" anywhere (as signal or module)
chipiq simiq design.vcd --include "data"
# Expands to: **.data and **.data.*
# Matches: .data, .dut.data, .cpu.alu.data, .data.valid

# Match "data" only at root level
chipiq simiq design.vcd --include ".data"
# Matches: .data only (no expansion)

# Match direct children of "alu" module anywhere in hierarchy
chipiq simiq design.vcd --include "**.alu.*"
# Matches: .cpu.alu.result, .cpu.alu.overflow (NOT .cpu.alu or .cpu.alu.adder.sum)

# Match "alu" module with ALL descendants (recursive)
chipiq simiq design.vcd --include "**.alu.**"
# Matches: .cpu.alu.result, .cpu.alu.adder.sum, .tb.dut.alu.flags
# Does NOT match: .alu alone (needs descendants)

# Match leaves containing "data" at any hierarchy level
chipiq simiq design.vcd --include "*data*"
# Expands to: **.*data* and **.*data*.*
# Matches: .data, .raw_data, .dut.input_data, .data_bus.width

# Match "data" substring anywhere in the full hierarchical path
chipiq simiq design.vcd --include "**data**"
# Matches: .data, .raw_data, .dut.input_data, .data.valid

# Match all signals at all levels
chipiq simiq design.vcd --include "**"

# Match only root-level signals (direct children of root)
chipiq simiq design.vcd --include ".*"
# Matches: .data, .clk (NOT .cpu.data)

# Match exactly 3 levels deep in hierarchy
chipiq simiq design.vcd --include ".*.*.*"
# Matches: .cpu.alu.data (NOT .alu.data or .cpu.alu.ctrl.enable)

# Combine multiple patterns with OR logic
chipiq simiq design.vcd --include "data" "clk" "enable"

# Include CPU signals but exclude debug/test infrastructure
chipiq simiq design.vcd --include "**.cpu.**" --exclude "*debug*" "*test*" "*monitor*"

# Match specific hierarchy path from root
chipiq simiq design.vcd --include ".tb.dut.cpu.*"
# Matches: .tb.dut.cpu.pc, .tb.dut.cpu.ir
# Does NOT match: .other.tb.dut.cpu.pc

Python API

The simiq() Function

Use the simiq() function to analyze VCD files programmatically:

from exe.simiq import simiq

Function Signature

def simiq(
    file: str = "",         # File path or URI to the VCD file
    report: str = "",       # Report type (docs, modules, signals, info, vcd)
    first: int = -1,        # First timestamp for report (default: from start)
    include: list = [".*"], # By default match names at top-level (root) only
    exclude: list = [],     # Do not exclude anything
    n: int = 10,            # Max number of timestamps to report on
    group: str = "time"     # Group value changes by "time" or by "name"
) -> str:

Parameters

  • file (str): Path or URI to VCD file (default: "")

    • Local paths: "path/to/file.vcd"
    • File URIs: "file:///absolute/path/file.vcd"
    • HTTP(S): "https://example.com/file.vcd"
    • Data URIs: "data:text/plain;base64,..."
  • report (str): Type of report (default: smart default)

    • "docs" - Display help documentation
    • "modules" - List module hierarchies
    • "signals" - List signals with properties
    • "info" - File metadata and statistics
    • "vcd" - Signal value changes
    • Default behavior: Returns "docs" when no file is provided, "vcd" when file is provided
  • first (int): Starting timestamp (default: -1 = start of file)

    • Set to specific timestamp to start parsing from that point
    • Only relevant for report="vcd"
  • include (list): Signal patterns to include (default: [] = all)

    • Empty list [] matches all signals (same as ["**"])
    • Supports Unix-style glob wildcards: * and **
    • See pattern matching rules above
  • exclude (list): Signal patterns to exclude (default: [])

    • Same pattern matching rules as include
    • Exclusions are applied after inclusions
  • n (int): Maximum number of timestamps to report (default: 10)

    • Only relevant for report="vcd"
  • group (str): Grouping mode (default: "time")

    • "time" - Group by timestamp
    • "name" - Group by signal name
    • Only relevant for report="vcd"

API Usage Examples

Example 1: View User Manual
from exe.simiq import simiq

manual = simiq(report="docs")
print(manual)
Example 2: Get File Information
info = simiq(
    report="info",
    file="path/to/waveform.vcd"
)
print(info)
Example 3: List All Modules
modules = simiq(
    report="modules",
    file="path/to/waveform.vcd",
    include=["**"]  # All signals at all levels
)
print(modules)
Example 4: List Signals in Specific Module
# Direct children of CPU module anywhere
signals = simiq(
    report="signals",
    file="design.vcd",
    include=["**.cpu.*"]
)
print(signals)

# CPU module with all descendants (recursive)
signals = simiq(
    report="signals",
    file="design.vcd",
    include=["**.cpu.**"]
)
print(signals)
Example 5: Analyze Signal Value Changes
# Parse 20 signal changes for data signals
changes = simiq(
    report="vcd",
    file="path/to/waveform.vcd",
    include=["*data*"],
    n=20,
    group="time"
)
print(changes)
Example 6: Monitor Specific Signals with Exclusions
# Monitor CPU module signals, exclude debug
changes = simiq(
    report="vcd",
    file="design.vcd",
    include=["**.cpu.**"],
    exclude=["*debug*", "*test*"],
    first=1000,
    n=50,
    group="name"
)
print(changes)
Example 7: Root-Level Signals Only
signals = simiq(
    report="signals",
    file="chip.vcd",
    include=[".data", ".clk", ".enable"]  # Leading dot = root-level
)
print(signals)
Example 8: Complex Pattern Matching
# Find all state machine signals except next_state
changes = simiq(
    report="vcd",
    file="controller.vcd",
    include=["*state*"],
    exclude=["*next_state*"],
    n=30,
    group="name"
)
print(changes)
Example 9: Pipeline Analysis
# Monitor pipeline module with all stages anywhere
pipeline_signals = simiq(
    report="vcd",
    file="cpu.vcd",
    include=["**.pipeline.**"],
    first=5000,
    n=100,
    group="time"
)
print(pipeline_signals)
Example 10: Bus Interface Monitoring
# Analyze AXI bus signals
axi_changes = simiq(
    report="vcd",
    file="soc.vcd",
    include=["*axi*"],
    exclude=["*axi*debug*"],
    n=40,
    group="name"
)
print(axi_changes)

Development

Running Tests

Run all tests using pytest:

uv run pytest

Run specific test file:

uv run pytest tests/test_simiq.py

Run tests with verbose output:

uv run pytest -v

Run tests matching a pattern:

uv run pytest -k "test_pattern"

Project Structure

chipiq/
├── src/chipiq/
│   ├── simiq/          # VCD analysis engine
│   │   ├── simiq.py    # Main simiq() function
│   │   ├── VCDFile.py  # VCD file parser
│   │   └── ...
│   ├── cli/            # Command-line interface
│   └── utils/          # Utility functions
├── tests/              # Test suite
│   ├── vcd/           # Sample VCD files
│   └── ...
└── examples/          # Usage examples

License

Copyright (c) 2025 ChipIQ. All rights reserved.

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

chipiq-0.0.9.2-py3-none-win_amd64.whl (29.6 MB view details)

Uploaded Python 3Windows x86-64

chipiq-0.0.9.2-py3-none-manylinux_2_17_x86_64.whl (46.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

chipiq-0.0.9.2-py3-none-macosx_11_0_arm64.whl (28.1 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file chipiq-0.0.9.2-py3-none-win_amd64.whl.

File metadata

  • Download URL: chipiq-0.0.9.2-py3-none-win_amd64.whl
  • Upload date:
  • Size: 29.6 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for chipiq-0.0.9.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 522d54eb424fba928bd04458115c3f653403d29a601a74323e80995673d1d6a5
MD5 886b7ee6852684c7260cbc306da4acbb
BLAKE2b-256 780ae40ec5f399a176774434f836cea61e1705f5561c4ab78698ca9cd7fa85f3

See more details on using hashes here.

File details

Details for the file chipiq-0.0.9.2-py3-none-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for chipiq-0.0.9.2-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 b6a5d66e4d495c872c67d65cee1185f44f308b19228858521a9a4df427cd7125
MD5 27f96fb546619349914713662606a5ec
BLAKE2b-256 47910e0661b06108bd3a60c3392f1c5a59e88cc3c1c5d9f89de8981f5006fc14

See more details on using hashes here.

File details

Details for the file chipiq-0.0.9.2-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for chipiq-0.0.9.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f3c022a91e401ec7d06de5b85c80e284616d0d529227dbed1c0957c232913ede
MD5 adf828026358762ba6ab118e37cc2606
BLAKE2b-256 150b8be93c607ed4fc41d4029b0c9fef0598b4aa698f853ec1b9bc50e52bddb3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page