Documentation
¶
Overview ¶
Package agni composes the engine. It is the entry point for a program that embeds Agni as a library rather than running the `agni` binary: one call produces the composed rule catalog, the composed relation registry, and the services that run over them.
It exists because composing correctly means getting FOUR independent global registration seams right, and three of them fail quietly when a binary misses one. A program that forgets stdlib/rules/builtin has an empty catalog, one that forgets stdlib/relations has an empty fact base, and either reports every design clean. New refuses both rather than running, so the composition mistake surfaces at startup instead of as a green report on a design nobody checked.
Files are NOT this package's business. Every option takes a VALUE (a loaded profile set, a parsed declaration, an fs.FS), never a path, because configuration travels as a value and reading it is the caller's world (C22, C13). The CLI reads its flags and hands the results here; an embedder reads its own config however it likes and does the same.
Index ¶
- Variables
- type Engine
- func (e *Engine) Catalog() *check.Catalog
- func (e *Engine) ProfileIndex() map[string][]profiles.Profile
- func (e *Engine) ProjectResolver() *service.ProjectResolver
- func (e *Engine) ProjectService() *service.ProjectService
- func (e *Engine) Registry() *facts.Registry
- func (e *Engine) RuleServices(d RuleServiceDeps) (*service.CheckService, *service.ReviewService)
- func (e *Engine) Warnings() []string
- type Option
- func WithConfigResolver(c service.ConfigResolver) Option
- func WithFSProjectStore(trees ...Tree) Option
- func WithIntent(d intent.Declaration) Option
- func WithProducerVersion(v string) Option
- func WithProfiles(ps []profiles.Profile) Option
- func WithProjectResolver(r *service.ProjectResolver) Option
- func WithProjectStore(s service.ProjectStore) Option
- func WithRelations(opts ...facts.Option) Option
- func WithSources(srcs ...check.RuleSource) Option
- func WithoutDatalogRules() Option
- type RuleLoader
- type RuleServiceDeps
- type Tree
Constants ¶
This section is empty.
Variables ¶
var MissingBuiltinsError = errors.New(
`agni: the built-in rule catalog is not installed, so none of the shipped EE rules will run and a ` +
`design is checked only against whatever this program composed itself. ` +
`Add: import _ "github.com/panyam/agni/stdlib/rules/builtin"`)
MissingBuiltinsError reports that the built-in rule source was never installed, so the shipped EE rule catalog is absent and a run reports only whatever the caller composed itself.
It asks check.BuiltinRules rather than measuring the composed catalog, which would not catch this: stdlib/profiles registers its own source from an init and this package imports it, so a program missing the built-ins still composes a NON-EMPTY catalog holding the interface-profile rules alone. A size check would pass while every rule the engine is known for was missing.
var MissingRelationsError = errors.New(
`agni: no fact relations are installed, so every datalog rule matches nothing and reports clean. ` +
`Add: import _ "github.com/panyam/agni/stdlib/relations"`)
MissingRelationsError reports that no relation catalog was installed, so the fact base is empty and every datalog-authored rule matches nothing. This is the failure examples/extension carried a hand-written warning comment about, since it neither fails to build nor errors at runtime.
Functions ¶
This section is empty.
Types ¶
type Engine ¶
type Engine struct {
// contains filtered or unexported fields
}
Engine is a composed engine: one rule catalog, one relation registry, and the project-resolution ports the services run against. It is built once by New and never mutated, so two surfaces built from one Engine cannot disagree about which rules are in effect.
func New ¶
New composes an Engine from the registered built-ins plus the options given. It fails when a composition seam is unpopulated, because every one of those failures is otherwise a clean report on an unchecked design; see MissingBuiltinsError and MissingRelationsError for the two it can return and what import fixes each.
It returns an error where check.CatalogWith and facts.NewRegistry panic. The divergence is deliberate: those two are called from an init or from a composing main, where a panic at process start is the standard-library convention and the caller is the programmer who made the mistake. New is called by an embedder whose own program has to decide what to do about a bad composition, and a library that panics inside a host's startup path takes that decision away.
func (*Engine) Catalog ¶
Catalog returns the composed rule catalog: the built-ins, every RegisterSource'd suite, and the profile, intent and ad-hoc sources the options supplied. Callers must not mutate the rules it holds.
func (*Engine) ProfileIndex ¶
ProfileIndex returns the by-name interface-profile index the review's absence gate reads: an interface counts as evaluating when any profile under its name is in the run, and the item scoped to it unions their nets.
It is exposed because a caller running a review itself needs it, and it MUST come from the same call that built the catalog. An index built separately can disagree with the catalog about which profiles are in effect, and the disagreement is silent: the gate clears on an interface whose rules the catalog dropped, so an item scoped by it scores a clean pass on an interface nothing checked.
func (*Engine) ProjectResolver ¶
func (e *Engine) ProjectResolver() *service.ProjectResolver
ProjectResolver returns the resolver the rule-running services use to find a design's project and compose that project's config into a run. It is nil when no project store was supplied, which the services accept: a design that resolves to no project runs on the engine's composed defaults.
func (*Engine) ProjectService ¶
func (e *Engine) ProjectService() *service.ProjectService
ProjectService returns the project/design listing service, or nil when no store was supplied.
func (*Engine) Registry ¶
Registry returns the composed relation registry, for a caller running its own queries through core/query's *From entry points rather than through a service.
func (*Engine) RuleServices ¶
func (e *Engine) RuleServices(d RuleServiceDeps) (*service.CheckService, *service.ReviewService)
RuleServices builds the two services that RUN rules, from this Engine's one catalog: the CheckService behind a check panel and ListRules, and the ReviewService behind the review resources.
They are returned TOGETHER, and the catalog is not a parameter, so a caller cannot hand one surface the composed catalog and the other something else. That drift is what this shape exists to prevent and it is not hypothetical: --profile-path reached both surfaces only after WS3-048, while --intent-path and a naming config's rules reached reviews alone. A rule missing from the check panel's catalog is indistinguishable there from a rule that ran and found nothing, so the disagreement is invisible from the outside.
func (*Engine) Warnings ¶
Warnings reports compositions that are legitimate but worth saying out loud, each naming the import that would change it. They are warnings rather than errors because an embedder may genuinely want the engine without one of these pieces; an empty catalog or an empty fact base gets an error from New instead. A caller that ignores the slice gets the behaviour it asked for, silently, which is the whole reason the slice exists.
type Option ¶
type Option func(*builder)
Option configures New. Every option carries a VALUE rather than a path, because reading config is the caller's business and configuration travels as a value (C22).
func WithConfigResolver ¶
func WithConfigResolver(c service.ConfigResolver) Option
WithConfigResolver supplies what resolves an analysis config's URIs into engine values: a project's interface profiles, its seeded parameters, its symbol paths, a design's intent. It is the seam where per-design config enters a run, so a server serving several projects gives each one its own composed rules rather than applying one team's config to every design it reads.
func WithFSProjectStore ¶
WithFSProjectStore supplies the shipped project store, which walks each tree for descriptors. It takes an fs.FS rather than a path so containment is structural: an fs.FS has no parent to climb into, so a resolution walk stops at the tree root.
This is how the default store reaches a caller without the package that implements it becoming public API. Everything true only of storing projects in DIRECTORIES stays behind service.ProjectStore, which is the contract; a caller that outgrows the directory shape implements the port and passes WithProjectStore instead.
func WithIntent ¶
func WithIntent(d intent.Declaration) Option
WithIntent composes a design-intent declaration into the catalog, which is what flips an intent-bound review item from needs-design-intent to a real verdict. Intent is per-DESIGN, so an Engine composed with one is scoped to that design; a server serving many resolves intent per design through the project config instead.
Load it with intent.LoadFile for YAML, or build the Declaration in Go.
func WithProducerVersion ¶
WithProducerVersion stamps the build identity onto a review's results document, so a stored run records which engine produced it. An embedder passes its own version string; the CLI passes the engine's.
func WithProfiles ¶
WithProfiles composes interface profiles into the catalog. A profile whose Name matches a built-in SUPERSEDES that built-in's rules rather than running alongside them, and the review's profile index tracks that replacement, so an item scoped to the interface cannot score a clean pass on a profile whose rules are no longer in the run.
Load them with profiles.LoadDir for a directory of YAML, or build the values in Go. Either way the file reading happens in the caller.
func WithProjectResolver ¶
func WithProjectResolver(r *service.ProjectResolver) Option
WithProjectResolver supplies an already-composed resolver, for a caller that built one to share with the services this package does not construct (the design, diff and query services all take the same resolver). It is the composed form of WithProjectStore plus WithConfigResolver and wins over both, so one run cannot resolve projects two ways.
func WithProjectStore ¶
func WithProjectStore(s service.ProjectStore) Option
WithProjectStore supplies the store that answers which projects and designs exist and which design an artifact belongs to. A deployment backed by a PLM system, an index, or a database implements service.ProjectStore and passes it here; WithFSProjectStore is the shipped directory-walking one.
func WithRelations ¶
WithRelations composes extra fact relations into the registry, for an overlay that projects its own tuples out of the Model. The built-in relation catalog arrives through the blank import of stdlib/relations rather than through this option, because it installs as one bulk payload.
func WithSources ¶
func WithSources(srcs ...check.RuleSource) Option
WithSources composes arbitrary rule sources into the catalog: a house suite built in Go, a naming convention's rules, anything satisfying check.RuleSource. They compose after the profile and intent sources, and a source implementing check.SupersedingSource replaces what it names.
func WithoutDatalogRules ¶
func WithoutDatalogRules() Option
WithoutDatalogRules declares that shipping with no datalog-authored rule suite is deliberate, and drops the warning New would otherwise record. It changes nothing about the composition. The warning exists because the absence is invisible from a report, and this option is how a caller who meant it says so once instead of filtering the string.
type RuleLoader ¶
type RuleLoader interface {
service.Loader
service.ReviewLoader
service.ConventionLoader
}
RuleLoader is what the two rule-running services need between them. CheckService and ReviewService take different loader interfaces, so naming the intersection lets one call build both without widening either service's own contract.
type RuleServiceDeps ¶
type RuleServiceDeps struct {
Loader RuleLoader
ReviewStore service.ReviewStore
Specs param.ParamProvider
BaseConvention string
}
RuleServiceDeps is the per-deployment I/O a rule-running service needs and the Engine does not hold: where designs are read from, where stored runs live, the seeded datasheet corpus, and the name of the deployment's base naming convention.
Directories
¶
| Path | Synopsis |
|---|---|
|
Package artifact defines how the engine NAMES a stored artifact: a design, a board export, a datasheet, a checklist, anything the injected Loader resolves to bytes.
|
Package artifact defines how the engine NAMES a stored artifact: a design, a board export, a datasheet, a checklist, anything the injected Loader resolves to bytes. |
|
Package census is the element-coverage guard (WS6-011).
|
Package census is the element-coverage guard (WS6-011). |
|
cmd
|
|
|
agni
command
Command agni is the CLI umbrella for the EDA tooling engine: read a design into the neutral IR and run analyses over it (stats, checks, diff; rendering and other surfaces will join here).
|
Command agni is the CLI umbrella for the EDA tooling engine: read a design into the neutral IR and run analyses over it (stats, checks, diff; rendering and other surfaces will join here). |
|
core
|
|
|
check
Package check runs rule checks over a netlist IR Design.
|
Package check runs rule checks over a netlist IR Design. |
|
check/naming
Package naming compiles an operator-supplied net-naming convention into a check.RuleSource (WS3-015).
|
Package naming compiles an operator-supplied net-naming convention into a check.RuleSource (WS3-015). |
|
classify
Package classify is the format-neutral component-classification pass (WS3-071).
|
Package classify is the format-neutral component-classification pass (WS3-071). |
|
diff
Package diff computes a semantic diff between two netlist IR Designs.
|
Package diff computes a semantic diff between two netlist IR Designs. |
|
facts
Package facts is the fact/relation layer: the tuple a relation projects a check.Model into, and the registry those relations install themselves in.
|
Package facts is the fact/relation layer: the tuple a relation projects a check.Model into, and the registry those relations install themselves in. |
|
graph
Package graph builds a netlist-graph view of a design from the core IR alone, for formats that carry no schematic page (IPC-2581, a bare netlist, a board-only export).
|
Package graph builds a netlist-graph view of a design from the core IR alone, for formats that carry no schematic page (IPC-2581, a bare netlist, a board-only export). |
|
model
Package model is the design read-surface CONTRACT: the Model interface a rule or query evaluates against, plus the value types that interface exposes.
|
Package model is the design read-surface CONTRACT: the Model interface a rule or query evaluates against, plus the value types that interface exposes. |
|
query
Package query is the design query surface (WS3-029): a small declarative datalog over the WS3-004 fact base (check.Facts), so an engineer runs ad-hoc queries — "search your whole design as relations, including datasheets" — and every answer carries the provenance of the facts that produced it.
|
Package query is the design query surface (WS3-029): a small declarative datalog over the WS3-004 fact base (check.Facts), so an engineer runs ad-hoc queries — "search your whole design as relations, including datasheets" — and every answer carries the provenance of the facts that produced it. |
|
render
Package render turns the geometry sidecar (agni.v1.geom) into concrete drawable output.
|
Package render turns the geometry sidecar (agni.v1.geom) into concrete drawable output. |
|
report
Package report aggregates a check run into the shape a person reads: what was checked, what it rests on, and what to do about the parts that failed.
|
Package report aggregates a check run into the shape a person reads: what was checked, what it rests on, and what to do about the parts that failed. |
|
results
Package results reads and writes the check-result document (agni.v1.checks.CheckResults), the artifact half of the checks contract (WS3-103).
|
Package results reads and writes the check-result document (agni.v1.checks.CheckResults), the artifact half of the checks contract (WS3-103). |
|
results/foreign
Package foreign imports a check-result document from another tool's report (WS3-104).
|
Package foreign imports a check-result document from another tool's report (WS3-104). |
|
review
Package review runs a project's declared design-review checklist (a "manifest") against one design and reports, per checklist item, whether its check passed, failed, did not apply, or is not yet automated (WS3-050).
|
Package review runs a project's declared design-review checklist (a "manifest") against one design and reports, per checklist item, whether its check passed, failed, did not apply, or is not yet automated (WS3-050). |
|
svg
Package svg builds SVG documents ergonomically, replacing hand-formatted fmt.Fprintf calls.
|
Package svg builds SVG documents ergonomically, replacing hand-formatted fmt.Fprintf calls. |
|
validate
Package validate holds the reader-health invariants behind `agni validate` (WS6-007): structural sanity checks over what a reader produced, catching "parsed but empty" and "placements that resolve to nothing" regressions that per-fixture unit tests miss on real files.
|
Package validate holds the reader-health invariants behind `agni validate` (WS6-007): structural sanity checks over what a reader produced, catching "parsed but empty" and "placements that resolve to nothing" regressions that per-fixture unit tests miss on real files. |
|
datasheet
|
|
|
candidate
Package candidate is the seam between "something proposed a fact" and "a person accepted it".
|
Package candidate is the seam between "something proposed a fact" and "a person accepted it". |
|
derive
Package derive is the deterministic extraction stage of the datasheet pipeline (docs/24-derivation.md): PartSpec = f(document, toolchain, recipes, patches).
|
Package derive is the deterministic extraction stage of the datasheet pipeline (docs/24-derivation.md): PartSpec = f(document, toolchain, recipes, patches). |
|
doc
Package doc loads, validates, and queries doc-IR Documents (agni.v1.doc): the intermediate decomposition of a source document (datasheet PDF, app note) that sits between the raw bytes and the parameter-IR.
|
Package doc loads, validates, and queries doc-IR Documents (agni.v1.doc): the intermediate decomposition of a source document (datasheet PDF, app note) that sits between the raw bytes and the parameter-IR. |
|
docindex
Package docindex answers questions INSIDE one datasheet: given a phrase, which passages or table cells of this document are about it, and where exactly are they.
|
Package docindex answers questions INSIDE one datasheet: given a phrase, which passages or table cells of this document are about it, and where exactly are they. |
|
param
Package param loads and validates parameter-IR PartSpecs (agni.v1.param), the datasheet-parameter contract described in docs/20-parameter-ir.md.
|
Package param loads and validates parameter-IR PartSpecs (agni.v1.param), the datasheet-parameter contract described in docs/20-parameter-ir.md. |
|
gen
|
|
|
Package intake produces a SANITIZED, deterministic summary of a design — the factual skeleton the /design-intake onboarding workflow builds on (WS3-091).
|
Package intake produces a SANITIZED, deterministic summary of a design — the factual skeleton the /design-intake onboarding workflow builds on (WS3-091). |
|
internal
|
|
|
constraints
Package constraints sweeps the repo's SOURCE for CONSTRAINTS.md rules that no single package owns, so `go test ./...` (and therefore `make testall`) enforces them.
|
Package constraints sweeps the repo's SOURCE for CONSTRAINTS.md rules that no single package owns, so `go test ./...` (and therefore `make testall`) enforces them. |
|
expect
Package expect loads a test design's expected findings from a sidecar file, so one artifact drives both the conformance harness (this repo) and, later, the web viewer's expectations panel (roadmap WS9-018).
|
Package expect loads a test design's expected findings from a sidecar file, so one artifact drives both the conformance harness (this repo) and, later, the web viewer's expectations panel (roadmap WS9-018). |
|
geomath
Package geomath is the shared geometry math for the geom sidecar: mapping symbol-local coordinates into sheet (world) coordinates under a placement Transform.
|
Package geomath is the shared geometry math for the geom sidecar: mapping symbol-local coordinates into sheet (world) coordinates under a placement Transform. |
|
mounts
Package mounts is the containment boundary of the web tier: named root folders the server exposes, plus the join that keeps every client-supplied path inside its mount.
|
Package mounts is the containment boundary of the web tier: named root folders the server exposes, plus the join that keeps every client-supplied path inside its mount. |
|
native
Package native shells out to a format's own CLI to produce a golden reference render (SVG), to validate the WebGL/SVG paths against.
|
Package native shells out to a format's own CLI to produce a golden reference render (SVG), to validate the WebGL/SVG paths against. |
|
netgraph
Package netgraph assembles a pin-level netlist from schematic geometry.
|
Package netgraph assembles a pin-level netlist from schematic geometry. |
|
projects
Package projects is the filesystem-backed implementation of service.ProjectStore: it discovers the `project.yaml` / `design.yaml` descriptors that name a design and the set of designs a team shares config across (agni issue 170).
|
Package projects is the filesystem-backed implementation of service.ProjectStore: it discovers the `project.yaml` / `design.yaml` descriptors that name a design and the set of designs a team shares config across (agni issue 170). |
|
refdes
Package refdes holds what a reference designator MEANS, for the layers that have to agree on it.
|
Package refdes holds what a reference designator MEANS, for the layers that have to agree on it. |
|
server
Package server is the Connect translation layer over the transport-neutral service implementations (CONSTRAINTS C13): one adapter per service, each method a pure unwrap/call/wrap plus the sentinel-to-code mapping in toConnectErr.
|
Package server is the Connect translation layer over the transport-neutral service implementations (CONSTRAINTS C13): one adapter per service, each method a pure unwrap/call/wrap plus the sentinel-to-code mapping in toConnectErr. |
|
sexpr
Package sexpr is the shared s-expression parser for the format readers (KiCad, EDIF) and the coverage census.
|
Package sexpr is the shared s-expression parser for the format readers (KiCad, EDIF) and the coverage census. |
|
symread
Package symread is the shared rim of the symbol-file schematic readers (xschem, gEDA gschem, and any future dialect such as Lepton EDA): the netlist-tier logic that was byte-identical or constant-parameterized between them.
|
Package symread is the shared rim of the symbol-file schematic readers (xschem, gEDA gschem, and any future dialect such as Lepton EDA): the netlist-tier logic that was byte-identical or constant-parameterized between them. |
|
version
Package version reports the engine build's identity, so an artifact the engine writes can name what produced it.
|
Package version reports the engine build's identity, so an artifact the engine writes can name what produced it. |
|
readers
|
|
|
edif
Package edif parses EDIF 2.0.0 netlists into the agni IR.
|
Package edif parses EDIF 2.0.0 netlists into the agni IR. |
|
formats
Package formats is the single registry of design-file formats the engine reads: for each extension, the UI label, the netlist reader, and the faithful-geometry reader.
|
Package formats is the single registry of design-file formats the engine reads: for each extension, the UI label, the netlist reader, and the faithful-geometry reader. |
|
geda
Package geda reads gEDA gschem schematic (.sch) and symbol (.sym) files into the agni IR.
|
Package geda reads gEDA gschem schematic (.sch) and symbol (.sym) files into the agni IR. |
|
ipc2581
Package ipc2581 reads IPC-2581 (revision A/B/C) interchange XML into the neutral IR (agni.v1.ir).
|
Package ipc2581 reads IPC-2581 (revision A/B/C) interchange XML into the neutral IR (agni.v1.ir). |
|
kicad
Package kicad reads KiCad s-expression files (.kicad_pcb, .kicad_sch) into the neutral IR (agni.v1.ir).
|
Package kicad reads KiCad s-expression files (.kicad_pcb, .kicad_sch) into the neutral IR (agni.v1.ir). |
|
telesis
Package telesis reads the flat Telesis netlist (`.tel`) that the Mentor/Siemens schematic flow emits, into the neutral IR.
|
Package telesis reads the flat Telesis netlist (`.tel`) that the Mentor/Siemens schematic flow emits, into the neutral IR. |
|
xschem
Package xschem reads xschem schematic (.sch) and symbol (.sym) files into the agni IR.
|
Package xschem reads xschem schematic (.sch) and symbol (.sym) files into the agni IR. |
|
Package service holds the importable, transport-neutral service implementations (CONSTRAINTS C13).
|
Package service holds the importable, transport-neutral service implementations (CONSTRAINTS C13). |
|
stdlib
|
|
|
profiles
Package profiles turns a declarative interface definition into check rules (WS3-034).
|
Package profiles turns a declarative interface definition into check rules (WS3-034). |
|
relations
Package relations is the standard EDB relation catalog: the built-in "data providers" that project a check.Model (and a seeded datasheet library) into the query engine's fact base — netlist, board, and datasheet relations.
|
Package relations is the standard EDB relation catalog: the built-in "data providers" that project a check.Model (and a seeded datasheet library) into the query engine's fact base — netlist, board, and datasheet relations. |
|
reviewquery
Package reviewquery bridges a review manifest's inline query bindings to the datalog engine.
|
Package reviewquery bridges a review manifest's inline query bindings to the datalog engine. |
|
ruledef
Package ruledef reads and writes rule DEFINITIONS: the declarative source a rule compiles from (WS3-103).
|
Package ruledef reads and writes rule DEFINITIONS: the declarative source a rule compiles from (WS3-103). |
|
rules/builtin
Package builtin is the standard EE rule catalog: one file per rule (rule_*.go), each a check.Rule value carrying its documentation and an Eval, plus the declarative-twin Specs that the parity tests hold to those Evals.
|
Package builtin is the standard EE rule catalog: one file per rule (rule_*.go), each a check.Rule value carrying its documentation and an Eval, plus the declarative-twin Specs that the parity tests hold to those Evals. |
|
rules/datalog
Package datalog holds check rules authored as datalog queries (via query.RuleFromQuery, WS3-038) rather than as Go or Spec.
|
Package datalog holds check rules authored as datalog queries (via query.RuleFromQuery, WS3-038) rather than as Go or Spec. |
|
rules/intent
Package intent checks a loaded design against a DESIGN-INTENT declaration: an external, authored statement of what a design is SUPPOSED to contain, which the netlist is checked against.
|
Package intent checks a loaded design against a DESIGN-INTENT declaration: an external, authored statement of what a design is SUPPOSED to contain, which the netlist is checked against. |
|
tools
|
|
|
catalogdocs
command
Command catalogdocs generates the docsite's browsable rule and relation catalog (issue 14) from the composed engine catalog and the embedded per-rule/per-relation Detail markdown.
|
Command catalogdocs generates the docsite's browsable rule and relation catalog (issue 14) from the composed engine catalog and the embedded per-rule/per-relation Detail markdown. |
|
datasheetstatus
command
Command datasheetstatus reports the Stage-A extraction freshness of a datasheet corpus laid out as datasheets/<vendor>/<PART>/ (WS13-009): per part, which source PDFs have a doc-IR sibling, whether that doc-IR still matches the PDF bytes and the installed toolchain, and whether a part-level PartSpec exists.
|
Command datasheetstatus reports the Stage-A extraction freshness of a datasheet corpus laid out as datasheets/<vendor>/<PART>/ (WS13-009): per part, which source PDFs have a doc-IR sibling, whether that doc-IR still matches the PDF bytes and the installed toolchain, and whether a part-level PartSpec exists. |
|
pdf2doc/validate
command
Command validate loads a doc-IR textproto, runs doc.Validate, and prints a per-page region summary.
|
Command validate loads a doc-IR textproto, runs doc.Validate, and prints a per-page region summary. |
