Rules#

class pyedb.workflows.drc.drc.Rules(/, **data: Any)#

Bases: pydantic.BaseModel

Centralized container for all design rule categories.

This class provides a type-safe, serializable container for design rules with JSON/YAML round-trip support and a fluent API for building rule decks.

Attributes:
min_line_widthlist of MinLineWidth

Minimum acceptable trace width rules per layer or globally.

min_clearancelist of MinClearance

Spacing requirements between nets (wildcards allowed).

min_annular_ringlist of MinAnnularRing

Minimum annular ring requirements for drilled holes.

diff_pair_length_matchlist of DiffPairLengthMatch

Length matching constraints for differential pairs.

back_drill_stub_lengthlist of BackDrillStubLength

Maximum allowed back-drill stub length constraints.

copper_balancelist of CopperBalance

Copper density balance limits per layer or zone.

Examples

Build rules programmatically:

>>> rules = (
...     Rules()
...     .add_min_line_width("pwr", "15mil")
...     .add_min_clearance("clk2data", "4mil", "CLK*", "DATA*")
...     .add_min_annular_ring("via5", "5mil")
...     .add_copper_balance("top_bal", max_percent=10, layers=["TOP"])
... )

Load from JSON file:

>>> rules = Rules.parse_file("my_rules.json")

Export to JSON:

>>> rules.model_dump_json(indent=2)

Overview#

from_dict

Create Rules instance from dictionary.

to_dict

Convert Rules to dictionary.

add_min_line_width

Append a minimum line width rule.

add_min_clearance

Append a minimum clearance rule between nets.

add_min_annular_ring

Append a minimum annular ring rule for drilled holes.

add_diff_pair_length_match

Append a differential pair length matching rule.

add_back_drill_stub_length

Append a maximum back-drill stub length rule.

add_copper_balance

Append a copper density balance rule.

Import detail#

from pyedb.workflows.drc.drc import Rules

Attribute detail#

Rules.min_line_width: list[MinLineWidth] = []#
Rules.min_clearance: list[MinClearance] = []#
Rules.min_annular_ring: list[MinAnnularRing] = []#
Rules.diff_pair_length_match: list[DiffPairLengthMatch] = []#
Rules.back_drill_stub_length: list[BackDrillStubLength] = []#
Rules.copper_balance: list[CopperBalance] = []#

Method detail#

classmethod Rules.from_dict(data: dict[str, Any]) Rules#

Create Rules instance from dictionary.

Parameters:
datadict

Dictionary produced by json.load(), yaml.safe_load(), etc.

Returns:
Rules

Validated instance ready for Drc.check().

Examples

>>> import json
>>> with open("rules.json") as f:
...     data = json.load(f)
>>> rules = Rules.from_dict(data)
Rules.to_dict() dict[str, Any]#

Convert Rules to dictionary.

Returns:
dict

JSON-serializable dictionary.

Examples

>>> rules = Rules().add_min_line_width("trace", "3mil")
>>> data = rules.to_dict()
>>> "min_line_width" in data
True
Rules.add_min_line_width(name: str, value: str, layers: list[str] | None = None) Rules#

Append a minimum line width rule.

Parameters:
namestr

Rule identifier for reporting.

valuestr

Minimum width with unit (e.g., "3.5mil", "0.1mm").

layerslist of str or None, optional

Layer names to apply rule to. If None, applies to all signal layers. The default is None.

Returns:
Rules

Self for method chaining.

Examples

>>> rules = Rules().add_min_line_width("trace_width", "3.5mil")
>>> len(rules.min_line_width)
1
Rules.add_min_clearance(name: str, value: str, net1: str, net2: str) Rules#

Append a minimum clearance rule between nets.

Parameters:
namestr

Rule identifier for reporting.

valuestr

Minimum clearance with unit (e.g., "4mil", "0.15mm").

net1str

First net name or wildcard ("*" matches all).

net2str

Second net name or wildcard ("*" matches all).

Returns:
Rules

Self for method chaining.

Examples

>>> rules = Rules().add_min_clearance("clk2data", "4mil", "CLK*", "DATA*")
>>> rules.min_clearance[0].net1
'CLK*'
Rules.add_min_annular_ring(name: str, value: str) Rules#

Append a minimum annular ring rule for drilled holes.

Parameters:
namestr

Rule identifier for reporting.

valuestr

Minimum ring width with unit (e.g., "2mil", "0.05mm").

Returns:
Rules

Self for method chaining.

Examples

>>> rules = Rules().add_min_annular_ring("via_ring", "2mil")
>>> rules.min_annular_ring[0].value
'2mil'
Rules.add_diff_pair_length_match(name: str, tolerance: str, pairs: list[tuple[str, str]]) Rules#

Append a differential pair length matching rule.

Parameters:
namestr

Rule identifier for reporting.

tolerancestr

Maximum allowed length difference with unit (e.g., "0.1mm").

pairslist of tuple[str, str]

List of (positive_net, negative_net) tuples.

Returns:
Rules

Self for method chaining.

Examples

>>> rules = Rules().add_diff_pair_length_match("usb_match", tolerance="0.1mm", pairs=[("USB_DP", "USB_DN")])
>>> rules.diff_pair_length_match[0].tolerance
'0.1mm'
Rules.add_back_drill_stub_length(name: str, value: str) Rules#

Append a maximum back-drill stub length rule.

Parameters:
namestr

Rule identifier for reporting.

valuestr

Maximum allowed stub length with unit (e.g., "6mil").

Returns:
Rules

Self for method chaining.

Examples

>>> rules = Rules().add_back_drill_stub_length("max_stub", "6mil")
>>> rules.back_drill_stub_length[0].value
'6mil'
Rules.add_copper_balance(name: str, max_percent: int, layers: list[str]) Rules#

Append a copper density balance rule.

Parameters:
namestr

Rule identifier for reporting.

max_percentint

Maximum allowed imbalance percentage (e.g., 15 for 15%).

layerslist of str

Layer names to check for balance.

Returns:
Rules

Self for method chaining.

Examples

>>> rules = Rules().add_copper_balance("top_bal", max_percent=10, layers=["TOP"])
>>> rules.copper_balance[0].max_percent
10