Skip to content

Commit

Permalink
use static consts for larger than 8 consts inputs
Browse files Browse the repository at this point in the history
  • Loading branch information
feltroidprime committed Aug 9, 2024
1 parent f31605e commit 357a65e
Show file tree
Hide file tree
Showing 3 changed files with 450 additions and 347 deletions.
7 changes: 5 additions & 2 deletions hydra/hints/io.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,11 @@ def int_array_to_u256_array(x: list[int] | list[PyFelt]) -> str:
return f"array![{', '.join([int_to_u256(i) for i in x])}]"


def int_array_to_u384_array(x: list[int] | list[PyFelt]) -> str:
return f"array![{', '.join([int_to_u384(i) for i in x])}]"
def int_array_to_u384_array(x: list[int] | list[PyFelt], const=False) -> str:
if const:
return f"[{', '.join([int_to_u384(i) for i in x])}]"
else:
return f"array![{', '.join([int_to_u384(i) for i in x])}]"


def bigint_pack(x: object, n_limbs: int, base: int) -> int:
Expand Down
42 changes: 32 additions & 10 deletions hydra/modulo_circuit.py
Original file line number Diff line number Diff line change
Expand Up @@ -895,15 +895,29 @@ def write_cairo1_input_stack(
return code, offset_to_reference_map, start_index

def fill_cairo_1_constants(self) -> str:
constants = [
bigint_split(self.values_segment.segment[offset].value, 4, 2**96)
constants_ints = [
self.values_segment.segment[offset].value
for offset in self.values_segment.segment_stacks[WriteOps.CONSTANT].keys()
]
constants_filled = "\n".join(
f"circuit_inputs = circuit_inputs.next_2([{','.join(hex(x) for x in constants[i])}]); // in{i}"
for i in range(len(constants))
)
return constants_filled
if len(constants_ints) < 8:
constants_split = [bigint_split(x, N_LIMBS, BASE) for x in constants_ints]
constants_filled = "\n".join(
f"circuit_inputs = circuit_inputs.next_2([{','.join(hex(x) for x in constants_split[i])}]); // in{i}"
for i in range(len(constants_ints))
)
return constants_filled, None
else:
import hydra.hints.io as io

const_name = (
self.name.upper() + "_"+CurveID(self.curve_id).name.upper() + "_CONSTANTS"
)
constants_filled = f"""
circuit_inputs = circuit_inputs.next_span({const_name}.span()); // in{0} - in{len(constants_ints)-1}
"""

const_array = f"const {const_name}: [u384; {len(constants_ints)}] = {io.int_array_to_u384_array(constants_ints, const=True)};"
return constants_filled, const_array

def write_cairo1_circuit(self, offset_to_reference_map: dict[int, str]) -> str:
code = ""
Expand Down Expand Up @@ -1029,12 +1043,16 @@ def compile_circuit_cairo_1(
"""

code += f"""
let mut circuit_inputs = ({','.join(outputs_refs_needed)},).new_inputs();
// Prefill constants:
{self.fill_cairo_1_constants()}
// Fill inputs:
"""

tmp, const_array = self.fill_cairo_1_constants()
code += tmp
code += """
// Fill inputs:
"""

acc_len = len(self.values_segment.segment_stacks[WriteOps.CONSTANT])
if input_is_struct:
for struct in self.input_structs:
Expand Down Expand Up @@ -1078,6 +1096,10 @@ def compile_circuit_cairo_1(
code += f"let res=array![{','.join([f'outputs.get_output({ref})' for ref in outputs_refs])}];\n"
code += "return res;\n"
code += "}\n"

if const_array:
code += "\n"
code += const_array
return code, function_name

def summarize(self):
Expand Down
Loading

0 comments on commit 357a65e

Please sign in to comment.