Add a reusable fixture runner API for compiled pipeline modules,
including
port binding handles plus drive/observe contexts for cycle fixtures.
This
makes it easier to build higher-level simulation harnesses on top of
vastly
without reimplementing per-cycle plumbing.
Also reduce pipeline compile/eval overhead in the hot paths:
- keep assign/function expressions AST-backed through lowering instead
of
reparsing elaborated source text
- add compile_pipeline_module_fast() so callers that do not need
span-rich
coverage metadata can skip rebuilding spanned expressions
- reduce generate elaboration cloning by reusing env/substitution state
during recursive expansion
- cut Value4 allocation churn by normalizing owned values in place and
borrowing when width/signedness already match
- add fast paths for fully-known multiplies, including common constants
and
widths up to 128 bits
Keep the existing span-preserving path for coverage-oriented callers,
and
add regression tests for fixture driving, generate-loop scope
restoration,
and the new Value4 multiply behavior.