From c4b7fbd430fd8760e35393bc752dad30669089e5 Mon Sep 17 00:00:00 2001 From: akhilles Date: Wed, 1 Oct 2025 15:03:26 -0400 Subject: [PATCH 1/3] Add physical range aliases for common units Signed-off-by: akhilles --- units.zen | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/units.zen b/units.zen index ac96299..a554c78 100644 --- a/units.zen +++ b/units.zen @@ -16,6 +16,16 @@ Energy = builtin.Energy MagneticFlux = builtin.MagneticFlux Conductance = builtin.Conductance +VoltageRange = builtin.physical_range("V") +CurrentRange = builtin.physical_range("A") +ResistanceRange = builtin.physical_range("Ohm") +CapacitanceRange = builtin.physical_range("F") +InductanceRange = builtin.physical_range("H") +FrequencyRange = builtin.physical_range("Hz") +TemperatureRange = builtin.physical_range("K") +TimeRange = builtin.physical_range("s") +PowerRange = builtin.physical_range("W") + def unit(spec, type): return type(spec) From 23dd4ba8ec7b3f8b80ebd70596a9e6f647dcb3ec Mon Sep 17 00:00:00 2001 From: akhilles Date: Thu, 2 Oct 2025 10:49:41 -0400 Subject: [PATCH 2/3] Add voltage to Power interface Signed-off-by: akhilles --- interfaces.zen | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interfaces.zen b/interfaces.zen index c2b5d22..dced7c2 100644 --- a/interfaces.zen +++ b/interfaces.zen @@ -1,3 +1,5 @@ +load("units.zen", "VoltageRange") + Analog = interface( NET=using(Net()), ) @@ -312,6 +314,7 @@ PcieGen3x2Lane = interface( Power = interface( NET=using(Net("VCC", symbol=Symbol(library="@kicad-symbols/power.kicad_sym", name="VCC"))), + voltage=field(VoltageRange | None, None), ) Pwm = interface( From 3c4c4dd64e52dd283ec666131317599bed87e610 Mon Sep 17 00:00:00 2001 From: akhilles Date: Thu, 2 Oct 2025 17:13:28 -0400 Subject: [PATCH 3/3] Add `voltage_within()` check Signed-off-by: akhilles --- checks.zen | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 checks.zen diff --git a/checks.zen b/checks.zen new file mode 100644 index 0000000..eb406b6 --- /dev/null +++ b/checks.zen @@ -0,0 +1,31 @@ +load("units.zen", "VoltageRange") +load("interfaces.zen", "Power") + +Severity = enum("error", "warning", "advice") + + +def voltage_within( + within: str | VoltageRange, name: str = "voltage_check", severity: Severity = Severity("error") +) -> typing.Callable: + def ensure_voltage_within(_module, net_name: str, voltage: VoltageRange, within: str | VoltageRange): + within = VoltageRange(within) + # drop nominal in within: + within = VoltageRange(min=within.min, max=within.max) + # ensure voltage is within within + min_valid = voltage.min >= within.min + max_valid = voltage.max <= within.max + err_msg = "Voltage range " + str(voltage) + " of " + net_name + " is not within " + str(within) + check(min_valid and max_valid, err_msg) + + def check_gen(power: Power, severity: Severity = severity, name: str = name): + check_name = power.NET.name + "_" + name + if not power.voltage: + return + builtin.add_electrical_check( + name=check_name, + check_fn=ensure_voltage_within, + inputs={"voltage": power.voltage, "within": within, "net_name": power.NET.name}, + severity=severity.value, + ) + + return check_gen