1use rhdl::prelude::*;
4
5pub const MAX_BATCH: u32 = 65_535;
7pub const INPUT_BYTES_PER_JOB: u64 = 64;
9pub const OUTPUT_PAYLOAD_BYTES: u64 = 2_208;
11pub const OUTPUT_AXI_BEATS: u8 = 35;
13pub const OUTPUT_SLOT_BYTES: u64 = 4_096;
15pub const FRAME_BUFFER_SLOTS: usize = 2;
17pub const LIVE_JOB_SLOTS: usize = 12;
19pub const HASHSIGS_HBM_ABI_V1: u32 = 0x4853_0001;
21pub const SUMMARY_ABI_REVISION: u16 = 1;
23pub const SHA256_PROFILE_WIRE_TAG: u8 = 1;
25
26pub(crate) const MAX_BATCH_BITS: b32 = b32(MAX_BATCH as u128);
30pub(crate) const INPUT_ALIGNMENT_MASK: b64 = b64(INPUT_BYTES_PER_JOB as u128 - 1);
31pub(crate) const OUTPUT_ALIGNMENT_MASK: b64 = b64(OUTPUT_SLOT_BYTES as u128 - 1);
32pub(crate) const OUTPUT_AXI_LEN: b8 = b8(OUTPUT_AXI_BEATS as u128 - 1);
33pub(crate) const ABI_WORD_BITS: b32 = b32(HASHSIGS_HBM_ABI_V1 as u128);
34pub(crate) const SUMMARY_ABI_REVISION_LO_BITS: b8 = b8(SUMMARY_ABI_REVISION as u128 & 0xff);
35pub(crate) const SUMMARY_ABI_REVISION_HI_BITS: b8 = b8(SUMMARY_ABI_REVISION as u128 >> 8);
36pub(crate) const SHA256_PROFILE_WIRE_TAG_BITS: b8 = b8(SHA256_PROFILE_WIRE_TAG as u128);
37
38pub const TERMINAL_SUCCESS: u8 = 0;
40pub const TERMINAL_CONFIGURATION: u8 = 1;
42pub const TERMINAL_ABORTED: u8 = 2;
44pub const TERMINAL_INPUT_AXI: u8 = 3;
46pub const TERMINAL_OUTPUT_AXI: u8 = 4;
48pub const TERMINAL_SIGNER: u8 = 5;
50pub const TERMINAL_PROTOCOL: u8 = 6;
52pub const TERMINAL_SUMMARY_AXI: u8 = 7;
54
55pub(crate) const TERMINAL_SUCCESS_BITS: b8 = b8(TERMINAL_SUCCESS as u128);
56pub(crate) const TERMINAL_CONFIGURATION_BITS: b8 = b8(TERMINAL_CONFIGURATION as u128);
57pub(crate) const TERMINAL_ABORTED_BITS: b8 = b8(TERMINAL_ABORTED as u128);
58pub(crate) const TERMINAL_INPUT_AXI_BITS: b8 = b8(TERMINAL_INPUT_AXI as u128);
59pub(crate) const TERMINAL_OUTPUT_AXI_BITS: b8 = b8(TERMINAL_OUTPUT_AXI as u128);
60pub(crate) const TERMINAL_SIGNER_BITS: b8 = b8(TERMINAL_SIGNER as u128);
61pub(crate) const TERMINAL_PROTOCOL_BITS: b8 = b8(TERMINAL_PROTOCOL as u128);
62pub(crate) const TERMINAL_SUMMARY_AXI_BITS: b8 = b8(TERMINAL_SUMMARY_AXI as u128);
63
64pub const ERROR_CONFIGURATION: u128 = 1 << 0;
66pub const ERROR_INPUT_AXI: u128 = 1 << 1;
68pub const ERROR_OUTPUT_AXI: u128 = 1 << 2;
70pub const ERROR_SIGNER_COMPLETION: u128 = 1 << 3;
72pub const ERROR_SIGNER_FAULT: u128 = 1 << 4;
74pub const ERROR_FRAME: u128 = 1 << 5;
76pub const ERROR_SCOREBOARD: u128 = 1 << 6;
78pub const ERROR_SOFT_ABORT: u128 = 1 << 7;
80pub const ERROR_COUNT: u128 = 1 << 8;
82pub const ERROR_SUMMARY_AXI: u128 = 1 << 9;
84pub const ERROR_BUFFER: u128 = 1 << 10;
86
87pub mod register {
89 pub const AP_CTRL: u128 = 0x00;
91 pub const GIER: u128 = 0x04;
93 pub const IP_IER: u128 = 0x08;
95 pub const IP_ISR: u128 = 0x0c;
97 pub const INPUTS_LO: u128 = 0x10;
99 pub const INPUTS_HI: u128 = 0x14;
101 pub const INPUTS_RESERVED: u128 = 0x18;
103 pub const OUTPUTS_LO: u128 = 0x1c;
105 pub const OUTPUTS_HI: u128 = 0x20;
107 pub const OUTPUTS_RESERVED: u128 = 0x24;
109 pub const SUMMARY_LO: u128 = 0x28;
111 pub const SUMMARY_HI: u128 = 0x2c;
113 pub const SUMMARY_RESERVED: u128 = 0x30;
115 pub const BATCH: u128 = 0x34;
117 pub const ABI_WORD: u128 = 0x38;
119 pub const NONCE_LO: u128 = 0x3c;
121 pub const NONCE_HI: u128 = 0x40;
123 pub const NONCE_RESERVED: u128 = 0x44;
125 pub const COMMAND: u128 = 0x48;
127 pub const LAST_STATUS: u128 = 0x4c;
129 pub const PROGRESS0: u128 = 0x50;
131 pub const PROGRESS1: u128 = 0x54;
133 pub const OUTPUT_STALL_LO: u128 = 0x58;
135 pub const OUTPUT_STALL_HI: u128 = 0x5c;
137 pub const QUEUE_STATUS: u128 = 0x60;
139 pub const FIRST_ERROR_JOB: u128 = 0x64;
141 pub const FIRST_ERROR_DETAIL: u128 = 0x68;
143 pub const MEMORY_FIRST_LO: u128 = 0x6c;
145 pub const MEMORY_FIRST_HI: u128 = 0x70;
147 pub const MEMORY_LAST_LO: u128 = 0x74;
149 pub const MEMORY_LAST_HI: u128 = 0x78;
151 pub const MEMORY_SPAN_LO: u128 = 0x7c;
153 pub const MEMORY_SPAN_HI: u128 = 0x80;
155}
156
157#[must_use]
159pub const fn abi_word() -> b32 {
160 ABI_WORD_BITS
161}
162
163const _: () = {
164 assert!(OUTPUT_PAYLOAD_BYTES == 34 * 64 + 32);
165 assert!(OUTPUT_AXI_BEATS == 35);
166 assert!(OUTPUT_SLOT_BYTES.is_power_of_two());
167 assert!(INPUT_BYTES_PER_JOB.is_power_of_two());
168 assert!(FRAME_BUFFER_SLOTS == 2);
169 assert!(LIVE_JOB_SLOTS == 12);
170 assert!(MAX_BATCH_BITS.raw() == MAX_BATCH as u128);
171 assert!(INPUT_ALIGNMENT_MASK.raw() == INPUT_BYTES_PER_JOB as u128 - 1);
172 assert!(OUTPUT_ALIGNMENT_MASK.raw() == OUTPUT_SLOT_BYTES as u128 - 1);
173 assert!(OUTPUT_AXI_LEN.raw() + 1 == OUTPUT_AXI_BEATS as u128);
174 assert!(ABI_WORD_BITS.raw() == HASHSIGS_HBM_ABI_V1 as u128);
175 assert!(SUMMARY_ABI_REVISION_LO_BITS.raw() == SUMMARY_ABI_REVISION as u128 & 0xff);
176 assert!(SUMMARY_ABI_REVISION_HI_BITS.raw() == SUMMARY_ABI_REVISION as u128 >> 8);
177 assert!(SHA256_PROFILE_WIRE_TAG_BITS.raw() == SHA256_PROFILE_WIRE_TAG as u128);
178 assert!(TERMINAL_SUCCESS_BITS.raw() == TERMINAL_SUCCESS as u128);
179 assert!(TERMINAL_CONFIGURATION_BITS.raw() == TERMINAL_CONFIGURATION as u128);
180 assert!(TERMINAL_ABORTED_BITS.raw() == TERMINAL_ABORTED as u128);
181 assert!(TERMINAL_INPUT_AXI_BITS.raw() == TERMINAL_INPUT_AXI as u128);
182 assert!(TERMINAL_OUTPUT_AXI_BITS.raw() == TERMINAL_OUTPUT_AXI as u128);
183 assert!(TERMINAL_SIGNER_BITS.raw() == TERMINAL_SIGNER as u128);
184 assert!(TERMINAL_PROTOCOL_BITS.raw() == TERMINAL_PROTOCOL as u128);
185 assert!(TERMINAL_SUMMARY_AXI_BITS.raw() == TERMINAL_SUMMARY_AXI as u128);
186};