param
a datasheet parameter's max value for a part, in its SI base unit (needs --params)
What it is ¶
param(mpn, symbol, max) yields one row per parameter of a datasheet spec that joined to a
part in the design, keyed by manufacturer part number (mpn) and the parameter’s datasheet
symbol (e.g. VDD, VIN, RDS(on)). The third argument is the parameter’s numeric maximum, in
that parameter’s SI base unit (volts, amps, ohms) whatever the vendor printed, so a threshold
written against it means the same thing across vendors. Join param.unit for the printed spelling.
Each row also carries the rendered value range and its test conditions, plus a citation back to
the datasheet page and table. One MPN can be shared by several components, so the projector
dedupes by MPN and emits each parameter once. A parameter whose unit has no known scale still appears
here with its NUMBER absent, and an ordering comparison refuses to bind an absent number against a
present one rather than answering by string order (agni issue 165).
This is the datasheet tier of the query surface. It is EMPTY unless agni is run with
--params <dir> pointing at a seeded PartSpec corpus. That is skip-not-false-pass by
construction: with no datasheet corpus loaded, the relation yields zero rows and every rule that
reads it reports not-applicable rather than a false pass.
For hardware engineers ¶
A row is one line off a part’s datasheet: an absolute-maximum, a recommended-operating limit, a
rated value, under the test conditions the datasheet stated. The max value is presented, not
silently compared. A parameter whose conditions survive only as free text (not structured as
eq/min/max) is not machine-comparable, so the tool shows it to you beside its citation
rather than auto-checking a design value against it. You query param during a review to see
what the datasheet actually claims for a part before trusting a rule that leans on it, or to spot
which parts have no extracted spec at all (they simply do not appear).
For software engineers ¶
A PartSpec is the .d.ts type stub for a closed-source dependency: machine-readable claims
about a part you cannot see inside, each written against one pinned doc revision and linking back
to the prose it came from. param projects those claims into query rows. The design-side
identity is component.mpn(ref_des, mpn); param is keyed by the same mpn, so the two relations
join on it. That join is the whole point of the tier: it is how a rule crosses from “this net in
the design drives R1’s VIN” to “R1’s MPN has an absolute-maximum VIN of 20 V”. Rows are 1:many
with a part (one per parameter). Absent means the datasheet corpus was not loaded, or the part
has no spec in it, never that the part is fine.
An empty join is not a clean result. component.mpn ⋈ param is an inner join, so a component
whose part has no seeded row for the symbol is silently dropped, and the query returns zero rows
for the same reason a genuinely-clean design does. Reading that as pass is the SQL bug of treating
a LEFT JOIN with a NULL right side as a validated row. A datasheet-backed review item therefore
checks whether the symbol is seeded at all and reports needs-data (closer to HTTP 424 Failed
Dependency than 404: the check exists, its input is missing) rather than pass. needs-data still
counts as covered, because the mechanism is wired and only the value is absent, and that lets
an overlay bind a datasheet check before its seed lands and watch it flip to a real verdict once
the value arrives (WS3-097). Whether the corpus holds one seeded part or a thousand is only how
many rows the table has: the relation is the union of every seeded spec, keyed by MPN, so more
seeds mean fewer needs-data items, never a different answer.
Go projector ¶
paramFacts in check/facts.go iterates Model.Components(), reads each component’s MPN via
Model.ComponentMPN and its spec via Model.PartSpec, dedupes by MPN, and emits one row per
spec.Parameters entry. Value is rendered by rangeText, Conditions by conditionsText,
and Cite by citation (document title, page, table or figure, extraction method, confidence);
Num is set to the parameter’s Value.Max when present, and surfaces as the max datalog argument.
One row per parameter of each joined part. Empty without --params, because the MPN-to-spec map
is built only when a param set is loaded, so a design with no matching specs yields nothing.
Datalog ¶
Both queries need --params. List every extracted parameter for each part, as MPN and symbol:
param(?mpn, ?sym, ?max) => ?mpn
Join to the design-side part identity to name the components a datasheet parameter applies to
(the bridge a rule like supply-exceeds-abs-max walks to compare a design rail against a
datasheet absolute-maximum):
component.mpn(?ref, ?mpn), param(?mpn, ?sym, ?max) => ?ref