Reference
Parts
The standard library and what a generic part deliberately lacks.
from fang.parts import Capacitor, Resistorfrom fang.lang import V, kOhm, uF
top = Resistor(resistance=10 * kOhm, package="R_0603_1608Metric")cap = Capacitor(capacitance=100 * uF, voltage_rating=16 * V)A generic part has no manufacturer
Section titled “A generic part has no manufacturer”Everything in the library is a GenericPart: a part with no vendor identity.
That is a deliberate absence, not an unfinished state. A design that says “a
10 kΩ resistor” is complete at the stage it is at. Attaching a manufacturer
before one has been chosen would be inventing a fact.
select() attaches the vendor
identity later, to the instance, without replacing the logical part.
The library
Section titled “The library”| Part | Parameters | Surfaces |
|---|---|---|
Resistor | resistance, power_rating, tolerance_pct | p1, p2 |
Capacitor | capacitance, voltage_rating, tolerance_pct | p1, p2 |
Inductor | inductance, current_rating, dc_resistance | p1, p2 |
Diode | forward_voltage, forward_current, reverse_voltage | p1, p2 |
LED | the Diode set, plus luminous_intensity | p1, p2 |
Fuse | current_rating, voltage_rating | p1, p2 |
Crystal | frequency, load_capacitance, tolerance_ppm | p1, p2 |
Transistor | vds_max, id_max, rds_on, vgs_threshold | gate, drain, source |
Regulator | output_voltage, input_voltage_max, output_current_max, dropout_voltage, quiescent_current | vin, vout (power ports) |
Connector | current_rating, voltage_rating | shell, plus per-instance pins |
TestPoint | none | probe |
MountingHole | diameter | mount |
DecouplingCapacitor is a Capacitor whose job is stated, so a checker can
find it. It is not in LIBRARY because it is a role, not a distinct part.
Every parameter is optional
Section titled “Every parameter is optional”Resistor(resistance=10 * kOhm) # power_rating unstatedAn unstated parameter is unknown, and any check that needed it reports undecided rather than assuming a value. If a resistor’s power rating matters to a constraint, the constraint says undecided until someone supplies it.
Packages and footprints
Section titled “Packages and footprints”Resistor(resistance=10 * kOhm, package="R_0603_1608Metric")package= attaches a Footprint trait. Where a part lands physically is a
trait rather than a parameter, because it is a fact about the realization, not
about the electrical behaviour.
Traits
Section titled “Traits”Behaviour attaches to a part without widening its class:
| Trait | Carries |
|---|---|
Footprint | Where a component lands physically |
Sourcing | Manufacturer, MPN, distributor codes |
DatasheetEvidence | The document a component’s claims are cited from |
Simulatable | A model, as data. The backend is not here |
Renderable | A view-compiler hint carrying no geometry and no meaning |
Writing your own
Section titled “Writing your own”Subclass Part and declare parameters, surfaces, pins and a pin map:
from fang.interfaces import I2CPort, Pin, PinMapfrom fang.lang import Parameter, Part, V
class IMU(Part): i2c = I2CPort(voltage=3.3 * V) supply_current = Parameter("A", description="run current") SCL = Pin("SCL", role="clock", number="4") SDA = Pin("SDA", role="data", number="5") pinmap = PinMap({"i2c.scl": "SCL", "i2c.sda": "SDA"})Nothing registers it. A part is a class, and using it is how it enters a design.