Simple electrical connectivity checker
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Go to file
Jan Petykiewicz 87ee1578a5 update min python version to match pyproject.toml 8 months ago
examples cleanup readme and example 8 months ago
snarled fix layout merging 8 months ago
.flake8 first pass at using klayout method. Many bugs likely remain 9 months ago
.gitignore initial commit 2 years ago
LICENSE.md initial commit 2 years ago
README.md update min python version to match pyproject.toml 8 months ago
pyproject.toml lots more work on klayout approach 9 months ago

README.md

snarled README

Layout connectivity checker.

snarled is a python package for checking electrical connectivity in multi-layer layouts.

It is intended to be "poor-man's LVS" (layout-versus-schematic), for when poverty has deprived the man of both a schematic and a better connectivity tool.

Installation

Requirements:

  • python >= 3.10 (written and tested with 3.11)
  • numpy
  • klayout (python package only)

Install with pip:

pip install snarled

Alternatively, install from git

pip install git+https://mpxd.net/code/jan/snarled.git@release

Example

See examples/check.py (python interface) or examples/run.sh (command-line interface).

Command line:

snarled connectivity.oas connectivity.txt -m layermap.txt

Python interface:

from pprint import pformat
import logging

import snarled
from snarled.types import layer_t


logging.basicConfig()
logging.getLogger('snarled').setLevel(logging.INFO)


connectivity = [
    ((1, 0), (1, 2), (2, 0)),   # M1 to M2 (via V12)
    ((1, 0), (1, 3), (3, 0)),   # M1 to M3 (via V13)
    ((2, 0), (2, 3), (3, 0)),   # M2 to M3 (via V23)
    ]

labels_map: dict[layer_t, layer_t] = {
    (1, 0): (1, 0),
    (2, 0): (2, 0),
    (3, 0): (3, 0),
    }

filename = 'connectivity.oas'

nets = snarled.trace_layout(filename, connectivity, topcell='top', labels_map=labels_map)
result = snarled.TraceAnalysis(nets)

print('\n')
print(result)

this prints the following:

INFO:snarled.trace:Adding layer (3, 0)
INFO:snarled.trace:Adding layer (2, 3)
INFO:snarled.trace:Adding layer (1, 3)
INFO:snarled.trace:Adding layer (1, 2)
INFO:snarled.trace:Adding layer (1, 0)
INFO:snarled.trace:Adding layer (2, 0)


Trace analysis
=============
Nets
(groups of electrically connected labels)
        SignalA,SignalB
        SignalC,SignalD,SignalI
        SignalE,SignalF
        SignalG,SignalH
        SignalK
        SignalK
        SignalL

Opens
(2+ nets containing the same name)
        SignalK : 2 nets

Shorts
(2+ unique names for the same net)
        SignalA,SignalB
        SignalC,SignalD,SignalI
        SignalE,SignalF
        SignalG,SignalH
=============

Code organization

  • The primary functionality is in trace; specifically trace.trace_layout().
  • main provides a command-line interface, supported by the functions in utils.