256 blocks.compute_offsets(
true);
259 for (
auto& block : blocks.get()) {
260 size_t block_size = block.size();
261 uint32_t fixed_block_size = block.get_fixed_size();
262 if (block_size > fixed_block_size && block != overflow_block) {
264 if (&block == &blocks.pub_inputs) {
265 std::ostringstream oss;
266 oss <<
"WARNING: Number of public inputs (" << block_size
267 <<
") cannot exceed capacity specified in structured trace: " << fixed_block_size;
270 if (&block == &blocks.ecc_op) {
271 std::ostringstream oss;
272 oss <<
"WARNING: Number of ecc op gates (" << block_size
273 <<
") cannot exceed capacity specified in structured trace: " << fixed_block_size;
278 blocks.has_overflow =
true;
283 if (&block == &blocks.memory) {
284 uint32_t overflow_cur_idx =
285 overflow_block.trace_offset() +
static_cast<uint32_t
>(overflow_block.size());
286 overflow_cur_idx -= block.trace_offset();
287 uint32_t
offset = overflow_cur_idx + 1;
288 for (
auto& idx : circuit.memory_read_records) {
290 if (idx == fixed_block_size - 1) {
291 circuit.memory_read_records.push_back(overflow_cur_idx);
293 if (idx >= fixed_block_size) {
294 idx -= fixed_block_size;
298 for (
auto& idx : circuit.memory_write_records) {
300 if (idx == fixed_block_size - 1) {
301 circuit.memory_write_records.push_back(overflow_cur_idx);
303 if (idx >= fixed_block_size) {
304 idx -= fixed_block_size;
311 size_t overflow_start = fixed_block_size - 1;
312 size_t overflow_end = block_size;
313 for (
auto [wire, overflow_wire] :
zip_view(block.wires, overflow_block.wires)) {
314 for (
size_t i = overflow_start; i < overflow_end; ++i) {
315 overflow_wire.push_back(wire[i]);
317 wire.resize(fixed_block_size);
319 for (
auto [selector, overflow_selector] :
zip_view(block.get_selectors(), overflow_block.get_selectors())) {
320 for (
size_t i = overflow_start; i < overflow_end; ++i) {
321 overflow_selector.push_back(selector[i]);
323 selector.resize(fixed_block_size);
327 for (
auto& selector : block.get_gate_selectors()) {
329 selector.set_back(0);
335 if (overflow_block.size() > overflow_block.get_fixed_size()) {
336 info(
"WARNING: Structured trace overflow mechanism in use. Performance may be degraded!");
337 overflow_block.fixed_size =
static_cast<uint32_t
>(overflow_block.size());
350 uint32_t ram_rom_offset = circuit.blocks.memory.trace_offset();
351 memory_read_records.reserve(circuit.memory_read_records.size());
352 for (
auto& index : circuit.memory_read_records) {
353 memory_read_records.emplace_back(index + ram_rom_offset);
355 memory_write_records.reserve(circuit.memory_write_records.size());
356 for (
auto& index : circuit.memory_write_records) {
357 memory_write_records.emplace_back(index + ram_rom_offset);