2i-issues Pyrope lowering & cgen emission defects (non-LEC)

A (registered-output interface) and B (hierarchical enums) are the only remaining work — both still hard-error in lowering (the latest patch round cada30102, import + ABC sra/mul ops, did not touch their code paths). Each is valid, documented Pyrope; they have no ordering between them, so pick either and work it end-to-end from its subtask below.

re-verified again 2026-06-20 — direct compile of both repros confirms neither has cleared: A aborts with reg-output-cycle (state register 'count' … homes at stage 0 but its declared landing cycle 0 requires home -1) and B with undefined-read (read of undefined variable 'eagle'), so both rows stay open. The companion TBD-feature audit (2026-06-20) — documented-but-unimplemented features, a category distinct from the A/B lowering defects — now lives in the index's TBD features still pending summary. B is itself a TBD (hierarchical enums) and is intentionally not given a new fail-by-design test there — it is already tracked as subtask B here.

Scope. This page deliberately excludes the LEC-engine precision issues (cvc5 false-refutes on hotmux / FSM-state / memory, the \x01nxt: phantom-output, the lgyosys no-reset-flop disagreement). Those are checker bugs, not compiler bugs, and live in the repo-root issues.md (Group C). Every code pointer below was re-verified by reading the source on 2026-06-20 against a fresh bazel build -c dbg //lhd:lhd.

Status snapshot (2026-06-20)

SubConstructKindTodayPrimary source
ARegistered-output interface -> (reg count:u8@[0])hard errorhomes at stage 0 … requires home -1upass/tolg/upass_tolg.cpp:4525
BHierarchical enum enum E=(,a=(,x,,y),…)hard errorread of undefined variable 'x'inou/prp/prp2lnast.cpp:4362

Depends on

None. A and B are each self-contained and the only remaining work.

Subtasks — pending

Verification

Each fix should both compile and prove equivalent to the directory's ref.v (which encodes the intended hardware). The re-test harness from the 2026-06-20 round lives in the session scratchpad (retest.sh = compile + both LEC engines; comb_oracle.py = exhaustive combinational iverilog; seq_oracle.py = clocked random iverilog). For one case:

# A, B: must stop hard-erroring
lhd compile <dir>/impl.prp --emit verilog:gen.v

# once they compile: prove equivalent to ref.v with BOTH engines
lhd lec --impl <dir>/impl.prp --ref <dir>/ref.v \
        --impl-top impl.top --ref-top top --set lec.solver=cvc5
lhd lec --impl <dir>/impl.prp --ref <dir>/ref.v \
        --impl-top impl.top --ref-top top --set lec.solver=lgyosys

Add a permanent regression for each: a glob-matched pair under inou/prp/tests/equiv/ (forward LEC) — these auto-generate a prp-<name> bazel target with no BUILD edit. Keep the full prp suite green (bazel test //inou/prp/... //upass/... //pass/...) and watch for no regression in the other (already-passing) unexpected_* cases.

Done when

The remaining work is A and B only. Each must compile and emit a netlist that is iverilog-correct and LEC-equivalent to ref.v under both solvers, with its checked-in regression flipping green; then its row is removed from the index's "Unimplemented / mis-lowering forms" tables. This page is deleted when both A and B clear.