Helion

Architecture

One Session, many crates. Device facts live in HAD TOML. The IDE paints that Session; it does not reimplement CAD. This is not a vendor-tool wrapper.

Pipeline

helion-sv / vhdl / hls  →  HNF
helion-pack → place → route (PathFinder)
helion-sta (XDC) → helion-drc → helion-bits
helion-fabric / helion-sim / helion-hw
helion-gui IdeModel paints the Session

Crates

CrateJob
helion-svSystemVerilog subset, preprocess, synth to LUT6/FF (sv-parser + AIG + FlowMap)
helion-vhdlVHDL-2008 elaborator, same LUT/FF path as SV
helion-hlsC subset onto LUT/FF/DSP
helion-irHNF cells/nets/ports (DONT_TOUCH, mark_debug, LOC)
helion-packLUTFF, IOB, MAC27, BRAM18
helion-placeTiming-driven place (timing_weight 0.75 on gold run)
helion-routePathFinder A* with hop delay in the cost
helion-staXDC/SDC constraints, WNS + hold (see crates/helion-sta/src/lib.rs::load_xdc)
helion-drcOccupancy, unrouted IO, clocks
helion-bitsFeatureMap frames, sparse .hbits, partial (DFX)
helion-fabric / helion-simCycle fabric (6-input IMUX LUT + FF + IOB + STAT) and event kernel
helion-hwIEEE 1149.1 TAP, sim cable, OFL / native MPSSE
helion-guiIdeModel + eframe shell (helion-ide)
helion-projTcl Session commands and .prj / read_ip
helion-deviceHAD load
helion-clihelion binary

XDC (load_xdc)

Constraint commands Helion parses are the first-token arms of load_xdc in crates/helion-sta/src/lib.rs. Point at that crate; do not treat this as a vendor constraint product. Object queries (get_ports, get_pins, get_clocks, get_cells) are arguments, not extra commands. Unknown first tokens are ignored. Empty-XDC gold stays WNS_PS=9640.

Commands (only these):

create_clock
create_generated_clock
set_input_delay
set_output_delay
set_false_path
set_multicycle_path
set_max_delay
set_min_delay
set_clock_groups
set_clock_uncertainty
set_clock_latency
set_disable_timing
set_case_analysis
set_propagated_clock
set_clock_sense
set_input_jitter
set_system_jitter
set_timing_derate
set_bus_skew
group_path
set_max_time_borrow
set_data_check
set_operating_conditions
set_property

set_property keys: PACKAGE_PIN, IOSTANDARD, DRIVE, SLEW, PULLTYPE, DIFF_TERM, IN_TERM.

Tcl Session CAD commands (synth_design, place_design, …) are a different list, below. They are not load_xdc commands.

Part HL10T-C32-1

CAD must query devices/helion/parts/HL10T-C32-1.toml. How to open it in the IDE: Use.

FieldValue
partHL10T-C32-1
idcode0x00011A1F
interior CLB32×32 (1024 CLB sites, 8 BLE each)
user IO32 (IO ring)
clock spinex=1, 8 gclk
BRAM188
MAC270 on this SKU
speed1
gridx=0 IO, x=1 CLK, x=2..33 CLB, x=34 IO; y=0 IO, y=1..32 interior, y=33 IO
IO ring · 32 user IO IO CLK x=1 32 × 32 CLB HL10T-C32-1
Labeled HAD regions. Empty-XDC counter gold WNS_PS=9640.

IR (HNF)

Cells, nets, and ports carry DONT_TOUCH, mark_debug, and LOC. helion hnf file.sv writes a round-trippable netlist. Checkpoints embed HNF. Restore must reproduce the same bitstream hash. (* keep *) / (* mark_debug *) and for generate unroll into that IR.

Tcl Session

CAD Session (not the load_xdc list): synth_design, opt_design, place_design, route_design, write_bitstream, write_hnf, get_cells / get_nets / get_pins, set_property, report_timing, report_utilization, open_hw_manager, program_hw, mark_debug, eco, write_checkpoint, report_die. Each command drives the real engine.

Bitstream

FeatureMap frames, sparse .hbits (encode/decode), partial program (DFX). Gold counter is 185 bytes because only configured frames are written. HELIONLIB primitives: LUT6, HFF, MAC27, BRAM18. Device facts live in HAD, not hardcoded in the CAD.

Gold

Empty-XDC examples/counter.sv at 10.000 ns: 4 LUTFF, 1 IOB, WNS_PS=9640, LED[16]=0000000111111110. QoR is gated in crates/helion-cli/tests/qor.rs. A LUT / WNS / bitstream-size change must update the table in the same commit with a reason.

Use Helion Roadmap (2.0 shipped)